Получить путь к файлу к переменной сразу после fs.writefile

#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);` BEFORE bwip-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);
});
  

Изменения:

  1. Используйте promise version of bwipjs.toBuffer() , чтобы упростить передачу асинхронного результата
  2. Переключитесь на fs.promises.writeFile() , поскольку мы уже используем promises и уже асинхронны
  3. require() Выйдите из асинхронного потока, поскольку он блокирует
  4. Использование async для функции, чтобы мы могли использовать await и более просто упорядочивать несколько асинхронных операций.
  5. Используется path.resolve() для получения полного абсолютного пути из нашего имени файла.
  6. Сделайте build_barcode() возврат обещанием, чтобы мы могли легче передавать обратно имя файла в конце нескольких асинхронных операций.
  7. Если вызывающий абонент хочет только имя каталога, связанное с возвращаемым именем файла, то он может использовать path.dirname() весь путь, чтобы получить только каталог.