#javascript #node.js #file #writefile
#javascript #node.js #файл #writefile
Вопрос:
Я пытаюсь получить путь к файлу, который я пишу, как показано ниже. помогите мне с кодом, как получить путь из приведенной ниже функции.
Мне нужен путь к файлу в качестве возвращаемой переменной. Я передаю число как barcodeSourceNumber .
pathToFile = build_barcode('123456789');
function build_barcode(barcodeSourceNumber) {
var pngFileName;
const bwipjs = require('bwip-js');
bwipjs.toBuffer({
bcid: 'code128', // Barcode type
text: barcodeSourceNumber, // Text to encode
scale: 3, // 3x scaling factor
height: 10, // Bar height, in millimeters
includetext: false, // Show human-readable text
textxalign: 'center', // Always good to set this
}, function (err, png) {
var pngFileName = = barcodeSourceNumber '.png';
fs.writeFileSync(pngFileName, png);
});
return pngFileName;
}
Но я получаю ‘.’ или undefined в качестве возвращаемого значения при попытке вызвать функцию.
Комментарии:
1. Предположительно, это связано с тем, что вы пытаетесь ссылаться
pngFileName
на этот ` return path.dirname(pngFileName);` BEFOREbwip-js.toBuffer()
завершил и вызвал обратный вызов, который вы установилиpngFileName
. Итак, это проблема времени. Еслиbwip-js.toBuffer()
действительно асинхронный, то вы не можете напрямую вернуть что-либо, связанное с его результатом, потому что ваша функция вернется до того, как будет вызван асинхронный обратный вызов. Вместо этого вам нужно будет передать возвращаемое значение обратно через обратный вызов или обещание.2. спасибо, не могли бы вы предоставить какой-нибудь код для моего существующего, я перепробовал много способов, но он все еще выдает мне ‘.’
3. Пожалуйста, укажите ожидаемые входные и выходные данные. Мне непонятно, чего вы пытаетесь достичь. Что вы передаете этой функции (приведите конкретный пример
barcodeSourceNumber
)? Что именно вы ожидаете, что функция вернет или передаст обратно вызывающей стороне? Почему вы используете.dirname()
в конце? Мне кажется, что ваш локальныйpngFileName
файл будет просто простым именем файла без указания пути к нему.4. Вы не ответили на большинство моих вопросов. Пожалуйста, прочитайте мой комментарий еще раз и ответьте на все вопросы там. Вы начинаете с имени файла, у которого нет пути, поэтому естественно, что
path.dirname()
у него не будет пути для вас. С вводом'123456789'
, каким вы ожидаете получить результат и почему вы используетеpath.dirname()
имя файла, в котором нет пути к нему? Кроме того, нам нужно знать, является лиbwipjs.toBuffer()
это синхронным или асинхронным? Он имеет асинхронный обратный вызов, так что это было бы моим предположением. Но, в любом случае, это влияет на то, как вы возвращаете данные из функции.5. Я пытаюсь получить полный путь для вновь созданного файла из fs.writeFileSync(pngFileName, png); в качестве моего вывода в виде строки
Ответ №1:
Это то, что делает promise
function build_barcode(barcodeSourceNumber) {
var pngFileName;
const bwipjs = require("bwip-js");
return new Promise((res, rej) => {
bwipjs.toBuffer(
{
bcid: "code128", // Barcode type
text: barcodeSourceNumber, // Text to encode
scale: 3, // 3x scaling factor
height: 10, // Bar height, in millimeters
includetext: false, // Show human-readable text
textxalign: "center", // Always good to set this
},
function (err, png) {
/* error handling */
/* if (err) {
rej(err)
} */
var pngFileName = barcodeSourceNumber ".png";
fs.writeFileSync(pngFileName, png);
res(pngFileName);
}
);
});
}
pathToFile = build_barcode("123456789").then((res) => {
console.log(`pngFileName: ${res}`);
});
Комментарии:
1. Это не дает мне путь к файлу, который был недавно создан fs.writeFileSync(pngFileName, png);
Ответ №2:
Конечно, я не уверен, является ли bwipJs.toBuffer асинхронным или нет. Вы также можете попробовать следующие методы
pathToFile = build_barcode("123456789");
function build_barcode(barcodeSourceNumber) {
var pngFileName;
const bwipjs = require("bwip-js");
bwipjs.toBuffer(
{
bcid: "code128", // Barcode type
text: barcodeSourceNumber, // Text to encode
scale: 3, // 3x scaling factor
height: 10, // Bar height, in millimeters
includetext: false, // Show human-readable text
textxalign: "center", // Always good to set this
},
function (err, png) {
pngFileName = barcodeSourceNumber ".png";
fs.writeFileSync(pngFileName, png);
}
);
return pngFileName;
}
Ответ №3:
Это то, что я бы посоветовал вам сделать:
const bwipjs = require('bwip-js');
const fs = require('fs');
async function build_barcode(barcodeSourceNumber) {
// use promise version of .toBuffer()
const pngData = await bwipjs.toBuffer({
bcid: 'code128', // Barcode type
text: barcodeSourceNumber, // Text to encode
scale: 3, // 3x scaling factor
height: 10, // Bar height, in millimeters
includetext: false, // Show human-readable text
textxalign: 'center', // Always good to set this
});
// combine filename with file extension and turn it into an absolute path
const pngFileName = path.resolve(barcodeSourceNumber '.png');
await fs.promises.writeFile(pngFileName, pngData);
// make final resolved value be the full filename
return pngFileName;
}
build_barcode('123456789').then(result => {
console.log(result);
}).catch(err => {
console.log(err);
});
Изменения:
- Используйте promise version of
bwipjs.toBuffer()
, чтобы упростить передачу асинхронного результата - Переключитесь на
fs.promises.writeFile()
, поскольку мы уже используем promises и уже асинхронны require()
Выйдите из асинхронного потока, поскольку он блокирует- Использование
async
для функции, чтобы мы могли использоватьawait
и более просто упорядочивать несколько асинхронных операций. - Используется
path.resolve()
для получения полного абсолютного пути из нашего имени файла. - Сделайте
build_barcode()
возврат обещанием, чтобы мы могли легче передавать обратно имя файла в конце нескольких асинхронных операций. - Если вызывающий абонент хочет только имя каталога, связанное с возвращаемым именем файла, то он может использовать
path.dirname()
весь путь, чтобы получить только каталог.