【问题标题】:error handle in promise nodejs + postgresql承诺 nodejs + postgresql 中的错误句柄
【发布时间】:2015-10-24 06:23:15
【问题描述】:

我刚开始学习nodejs 下面是我的代码...
Q1。我是否使用insertUserPendingBase() 正确处理错误消息??
我检查返回消息是否等于success。如果是这样,then 在这个例子中可以做什么?

第二季度。我在执行查询时使用pg 是否需要做任何事情来防止 SQL 注入?我在文档中看到没有必要,但我不确定..

欢迎任何可以改进我的代码的建议

路线

var express = require('express');
var router = express.Router();
var co = require('co');

// .. post
var insertUserPendingBase = function(token) {
  return new Promise(function (fulfill, reject){
    var query = "INSERT INTO user_pending_base (user_pending_email,user_pending_password,token_timestamp,token) VALUES ('" + user_email + "','" + user_password + "', CURRENT_TIMESTAMP,'" + token + "')";
    dbClient.query(query, function(err, result) {
      if (err) {
        reject(err);
      } else {
        fulfill('success');
      }
    });
  });

  // .then(function(value) {
  //   console.log(value);
  //   throw "error message";
  // }).catch(function(e) {
  //   console.log(e);
  // });
}

co(function *() {
  // ...
  var insertUserPendingBaseResult = yield insertUserPendingBase(generateTokenResult);

  console.log('insertUserPendingBaseResult:'+insertUserPendingBaseResult);
  if (insertUserPendingBaseResult == 'success') { // handle error like this ??

  }

  res.render('Account/Register/Index', {
    partials: {
      Content: 'Account/Register/Content',
    }
  });
}).catch(onerror);

function onerror(err) {
  console.error(err.stack);
}

更新

如果我更改 fulfill(result) 而不是 fulfill('success') 我将得到低于对象但没有关于失败或成功的消息

{ command: 'INSERT',
  rowCount: 1,
  oid: 0,
  rows: [],
  fields: [],
  _parsers: [],
  RowCtor: null,
  rowAsArray: false,
  _getTypeParser: [Function] }

更新 2

我找到了一种在co(function *() 中使用trycatch 的方法,如下所示,但我不确定这是编写干净代码的最佳方法吗?

co(function *() {
... 
try {
  var insertUserPendingBaseResult = yield insertUserPendingBase(generateTokenResult);
  // if success ...

} catch (err) {
  // if fail
  console.log(err);
}

【问题讨论】:

  • 如果你想通过 Promise 使用 node-postgres,请查看pg-promise

标签: node.js postgresql express error-handling promise


【解决方案1】:

无法评论 SQL 注入,但fulfill('success') 必须是fulfill(result)

要处理promise 的成功和失败,您应该使用thencatch,不需要生成器:

insertUserPendingBase.then(function(result) { /* handle result here */ })
                     .catch(function(ex) { /* handle exception here */ })

【讨论】:

  • 感谢您的回复,示例代码让我了解如何使用thencatch!我只是粘贴了我的代码的一部分,我需要对其他表进行处理,这取决于第一个表返回结果。所以我不想在then 里面有太多回调。
  • 如果我使用 generators 是否应该返回类似 fulfill(result) 的结果而不是 fulfill('success') ?以及执行后如何捕捉错误?
  • fulfill(result),但我不明白你为什么要使用generators。在许多方面,它们只是通向 ES7 async / await 的垫脚石,您今天已经可以使用 babel
猜你喜欢
  • 1970-01-01
  • 2016-09-12
  • 2021-01-08
  • 2018-12-27
  • 2019-03-31
  • 2022-12-04
  • 2018-10-22
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多