如何在Node.js中将数据从模型传递到路由器

时间:2018-09-01 15:05:38

标签: node.js express

我是Node.js的新手,正在尝试将一些数据从我的数据库模型传递回路由器,但是我找不到解决方案。我有以下调用模型的路由文件:

路由文件:

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

db.connect(function(err) {

if (err) {
  console.log('Unable to connect to MySQL.')
  process.exit(1)
  }
});

router.post('/', function(req, res) {
    customers.checkPassword(req.body.cust_id, req.body.password);
    res.sendStatus(200);
});

模型文件:

var db = require('../db.js');

module.exports.checkPassword = function(cust_id, password) {
    var sql = "SELECT Password FROM Shop.customers WHERE ID =" + cust_id;

    db.get().query(sql, function (err, res, fields) {

        result = res[0].Password;

        if (err) throw err
    });
};

我的问题是:如何将查询的结果Password传递回我的Route文件,以便执行此操作:

console.log('Password is', result);

我对此表示感谢。

2 个答案:

答案 0 :(得分:1)

我会用诺言

模型文件

module.exports.checkPassword = function(cust_id, password) {
  return new Promise(function(resolve, reject) {
    const sql = "SELECT Password FROM Shop.customers WHERE ID =" + cust_id;
    db.get().query(sql, function (err, res, fields) {
        if (err) return reject(err)
        result = res[0].Password;
        return resolve(result);
    });
  });  
};

路由文件

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

db.connect(function(err) {

if (err) {
  console.log('Unable to connect to MySQL.')
  process.exit(1)
  }
});

router.post('/', function(req, res) {
    customers.checkPassword(req.body.cust_id, req.body.password)
        .then((result) => {
            // DO: something with result
            res.status(200).send();
        })
        .catch(console.log); // TODO: Handle errors
});

使用异步/等待

router.post('/', async function(req, res) {
    try {
      const result = await customers.checkPassword(req.body.cust_id, req.body.password)
      // DO: something with the result
    } catch (e) {
      console.log(e); // TODO: handle errors
    } finally {
      res.status(200).send();
    }
});

我假设console.log('Password is', result);仅出于测试目的,显然您永远不要登录密码!另外,我建议将路由的callbabck移到其他模块上,以提高代码的可重复性。

您可能还会在npm上找到有用的promise-module模块,基本上是mysql的Promise包装器。

答案 1 :(得分:0)

您可以将凭证控件委派给数据库文件中的另一个函数,在该函数中,您可以决定在查找成功或失败后想要返回的数据类型。然后,您可以从调用它的地方访问它。