回调函数移动到外部js,不起作用

时间:2017-08-05 18:02:45

标签: node.js express

我的路由器上有一个回调函数,并且运行良好,但是我想要不重复我的回调函数来管理一个函数中的sql错误,然后我移动到外部文件

在将我的回调函数移动到外部文件之前

var express = require('express');
var router = express.Router();
var model= require('../models/customers');

router.get('/', function (req, res, next) {
    res.header('content-type', 'application/json');

    console.log('will do model.get');

    model.get(function (err, rows) {

      if (err) {
        res.status(500).send({error: 'Something failed!'})
      } else {
        res.json({data: rows});
      }

    });
});

出现错误时的响应是正确的:

{
    "error": "Something failed!"
}

之后,我将回调函数移动到外部文件:

./ LIB / dbfunctions

var dbfunctions  = {
    runSql: function (err, rows) {
        if (err) {
            res.status(500).send({error: 'Something failed!'})
        }
        else {
            res.json({data: rows});
        }
    }
}
module.exports = dbfunctions ;

然后我在我的文件

中导出此功能

路由器js:

var express = require('express');
var router = express.Router();
var model= require('../models/customers');
var dbfunctions = require('../libs/dbfunctions');

router.get('/:id?', function (req, res, next) {
    res.header('content-type', 'application/json');

    if (req.params.id) {

        model.getById(req.params.id, function (err, rows) {
            if (err) {

                res.json(err);
            }
            else {
                res.json({data:rows});
            }
        });
    }
    else {
        console.log('will do model.get');
        model.get( dbfunctions.runSql);
    }
});

但现在代码无法正常工作

ReferenceError: res is not defined
有人可以解释我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

当您将db回调处理程序移动到dbFunctions时,回调现在不会关闭路由器中间件函数,因此没有resreq个对象定义。

解决这个问题的一种方法是手动传递它们

var dbfunctions  = {
    runSql: function (err, rows, req, res) {
        if (err) {
            res.status(500).send({error: 'Something failed!'})
        }
        else {
            res.json({data: rows});
        }
    }
}
module.exports = dbfunctions ;

router.js

var express = require('express');
var router = express.Router();
var model= require('../models/customers');
var dbfunctions = require('../libs/dbfunctions');

router.get('/:id?', function (req, res, next) {
    res.header('content-type', 'application/json');

    if (req.params.id) {

        model.getById(req.params.id, function (err, rows) {
            if (err) {

                res.json(err);
            }
            else {
                res.json({data:rows});
            }
        });
    }
    else {
        console.log('will do model.get');
        model.get(function(err,rows){
                dbfunctions.runSql(err, rows, req, res);
        });
    }
});