[英]How am I suppoed to use callback or setTimeout?
我需要將 fileExistance 中的數據推送到結果中,並將結果導出到路由器文件夾中的 budget.js。 但我收到此錯誤消息
internal/validators.js:189
throw new ERR_INVALID_CALLBACK(callback);
^
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received []
at setTimeout (timers.js:121:3)
at Object.<anonymous> (C:\Users\Jaemin Windows10\GitHub\Jae_tasks\controller\budget.js:18:25)
const fs = require('fs');
var result = [];
const fileExistance = () => {
fs.readdir('./data/budget', function(err, files) {
if(err){
console.log(err);
} else if(!files.length) {
return "No Transaction history";
} else {
console.log("file Existance " + files);
result.push(files);
}
});
}
fileExistance();
console.log("result " + setTimeout(result, 1000));
exports.result = result;
這是路由器文件夾中的budget.js
const path = require('path');
const express = require('express');
const router = express.Router();
const fs = require('fs');
var budgetController = require('./../controller/budget');
console.log("result " + budgetController.result);
router.get('/budget', (req, res, next) => {
const result = budgetController.result;
console.log(result);
res.render('budget', {
prods: result,
pageTitle: 'Budget',
path:'/budget',
hasResults: result.length > 0,
activeBudget: true,
productCSS: true
});
});
router.post('/budget', (req, res, next) => {
console.log({title: req.body.title}.title);
filePath.push({title: req.body.title}.title);
res.redirect('/budget');
});
exports.router = router;
router 文件夾中的 budget.js 確實將數據放入結果中。 而且我不太了解如何使用回調,而且我是 Javascript 的新手。 我該如何解決這個問題?
controller 文件夾中的 budget.js
const fs = require('fs');
let fileExistance = new Promise(function(resolve, reject) {
fs.readdir('./data/budget', function(err, files) {
if(err){
console.log(err);
} else if(!files.length) {
resolve("No Transaction history");
} else {
console.log("file Existance " + files);
resolve(files);
}
});
});
exports.fileExistance = fileExistance;
路由器文件夾中的budget.js
router.get('/budget', (req, res, next) => {
budgetController.fileExistance.then(function(data){
console.log(data[0])
res.render('budget', {
prods: data,
pageTitle: 'Budget',
path:'/budget',
hasData: data.length > 0,
activeBudget: true,
productCSS: true
});
});
});
您的代碼當前有競爭條件。 fs.readdir
是所謂的異步 function 因為它需要一些時間來完成它需要做的事情。 正因為如此,你告訴fs.readdir
“嘿,go 做你需要做的事情,當你准備好時“給我回電話”。當你准備好時,做我在function(err, files) {
您正在導入第一個文件,但不能保證它會在任何時間段內填充結果。 如果您的路線使用得很快,結果將為空白。
您需要做的是將fileExistance
轉換為 function 在填充結果后進行回調。 執行此操作的 function 是 function ,它返回所謂的Promise
。
我建議您在繼續之前先玩弄並了解 javascript 的承諾。
祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.