#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()
это даже не асинхронно, так что нет никаких причин использовать его с обещанием.