Estoy tratando de escribir una función que lea un archivo y, dependiendo del éxito o el fracaso en la lectura, llamará a la función de resolución o rechazo. A continuación se muestra el código que he escrito.
let fs = require('fs'); const FILE_NAME = './assets/pies.json'; let pieRepo = { get: function(resolve, reject) { fs.readFile(FILE_NAME, function(err, data) { if(err) { reject(err); } else { resolve(JSON.parse(data)); } }); } }; module.exports = pieRepo;Sin embargo, cuando ejecuto "npm start", arroja el siguiente error
/workingdirectory/repos/pieRepo.js:12 resolve(JSON.parse(data)); ^ TypeError: resolve is not a function at /workingdirectory/repos/pieRepo.js:12:17 at FSReqWrap.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:53:3)Estoy usando la versión 16.11.0 de node.
El problema que enfrenta es la forma en que intenta resolver la promesa. Las funciones de resolución y rechazo están disponibles en Promise
let fs = require("fs"); const FILE_NAME = "YOUR PATH TO FILE"; let pieRepo = { get: () => { return new Promise((resolve, reject) => { fs.readFile(FILE_NAME, (err, data) => { if (err) { return reject(err); } resolve(JSON.parse(data)); }); }); }, }; module.exports = pieRepo;Puede leer más sobre Promise
Resolver y rechazar son funciones disponibles en las promesas.
Reemplace su código con esto:
let fs = require('fs'); const FILE_NAME = './assets/pies.json'; let pieRepo = { get: () => { return new Promise((resolve, reject) => { fs.readFile(FILE_NAME, (err, data) => { if (err) { return reject(err); } resolve(JSON.parse(data)); }); }); }, }; module.exports = pieRepo; Ahora, puede esperar la función de get .
Sin embargo, si este fuera mi proyecto, el código se vería así:
let fs = require('fs/promises'); const FILE_NAME = './assets/pies.json'; let pieRepo = { get: async () => { try { const data = await fs.readFile(FILE_NAME); return data; } catch (err) { throw new Error(err.message); } }, }; module.exports = pieRepo; Si desea prometer fs.readFile , puede hacerlo, pero las versiones prometidas de funciones fs están disponibles a través de fs/promises .
Tienes que usar Promise, aquí hay un ejemplo muy simple:
test() { return new Promise((resolve, reject) => { if (1 === 1) { resolve(true) } else { reject(false) } }) }