【问题标题】:How am I suppoed to use callback or setTimeout?我应该如何使用回调或 setTimeout?
【发布时间】:2020-08-13 01:25:08
【问题描述】:

我需要将 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 很陌生。 我该如何解决这个问题?

【问题讨论】:

    标签: javascript express callback


    【解决方案1】:

    控制器文件夹中的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
        });
      });
    });
    

    【讨论】:

      【解决方案2】:

      您的代码当前存在竞争条件。 fs.readdir 是所谓的异步函数,因为它需要一些时间来完成它需要做的事情。正因为如此,你告诉fs.readdir“嘿,去做你该做的事,准备好了就给我回电话。准备好了,做我在function(err, files) {指定的事情

      您正在导入第一个文件,但不能保证它会在任何时间段内填充结果。如果您的路线使用得很快,结果将为空白。

      您需要做的是将fileExistance 转换为一个函数,该函数在填充结果后接受回调。执行此操作的函数是返回所谓的 Promise 的函数。

      我建议你在继续之前尝试并理解 javascript 承诺。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2011-06-22
        • 2014-10-17
        • 2016-04-01
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2015-08-23
        相关资源
        最近更新 更多