Node.js — Функция не работает при экспорте

#node.js #asynchronous #module.exports

Вопрос:

Всем доброго дня,

Во-первых, спасибо за то, что всегда были таким удивительным сообществом. Вы все действительно очень помогаете мне в обучении и совершенствовании моего программирования и разработки!

У меня есть небольшой вопрос, связанный с модулем.экспорт в Node.js. Приведенная ниже функция запускается без проблем при прямом вызове:

 const fs = require('fs')
const {nanoid} = require('nanoid')

const createStormDB = () => {
    return new Promise((resolve, reject) => {
        try{
            const id = nanoid(4)
            const date = new Date() // Create date string for file naming
            let dateString = `${date.toISOString().split('T')[0]}` // Create date string for file naming
            let fileName = `${dateString}_deals_${id}.stormdb` // Create date string for file naming
            fs.openSync(`../StormDB/${fileName}`, 'w')

            resolve(fileName)
    
        }catch(err){
            reject(err)
        }
    })
}

module.exports = createStormDB
 

Он создает файл с определенным именем в определенной папке. Но когда я использую module.exports = createStormDB , меня встречает следующая ошибка:

 (node:12516) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, open '../StormDB/2021-07-19_deals_gYmJ.stormdb'
    at Object.openSync (fs.js:476:3)
    at C:NodePipedrive-ConnectorPipeDriveRequestscriptscreateStormDBFile.js:11:16
    at new Promise (<anonymous>)
    at createStormDB (C:NodePipedrive-ConnectorPipeDriveRequestscriptscreateStormDBFile.js:5:12)
    at Object.<anonymous> (C:NodePipedrive-ConnectorPipeDriveRequestplay.js:7:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
 

Есть ли что-то, что я неправильно понимаю, когда дело доходит до экспорта модулей? Я импортирую этот модуль, используя require опцию! Большое спасибо за помощь!

Комментарии:

1. Нет смысла заворачивать fs.openSync() в обещание. И вы не должны открывать файл, а затем ничего не делать с полученным дескриптором файла. Это просто приведет к утечке дескрипторов файлов.

Ответ №1:

.. Относительный путь в функции относится к текущему рабочему каталогу вызывающих сценариев, а не к каталогу, в котором находится файл.

Исходя из настроек и описания вашего пути, предполагается, что база данных находится в: C:NodePipedrive-ConnectorPipeDriveRequestStormDB

Если вы хотите, чтобы путь к базе данных оставался относительно файла javascript, содержащего функцию, используйте __dirname

 const path = require('path')
const db_path = path.join(__dirname, '..', 'StormDB', filename)
fs.openSync(db_path, 'w')
 

Комментарии:

1. В качестве примечания, fs.promises.open это обещанная версия функции. Создание обещания openSync кажется ненужным

2. Не говоря уже о том, что fs.openSync() это даже не асинхронно, так что нет никаких причин использовать его с обещанием.