promise nodejs + postgresql中的错误句柄

时间:2015-08-01 19:25:06

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

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

Q2。我在执行查询时使用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

我在try内找到了一种使用catchco(function *()的方式,如下所示,但我不确定这是制作干净代码的最佳方法吗?

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

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

1 个答案:

答案 0 :(得分:1)

无法对SQL注入发表评论,但fulfill('success')必须为fulfill(result)

要处理promise您应该使用thencatch的成功与否,不需要生成器:

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