【问题标题】:Simple Check Function with node.js, pg-promise使用 node.js,pg-promise 的简单检查功能
【发布时间】:2017-03-18 23:32:02
【问题描述】:

我正在尝试在this example 之后编写一个简单的check() 函数。该函数成功打印出“True!”但是当我执行console.log(submitModels.verifyOrganizationString(formInputs.organizationString)); 时,函数的返回值是undefined。如何让函数返回truefalse

现在该函数只返回"Invalid organization string",即使字符串有效。

我认为这个结果与 pg-promise 库有关,但我不确定。

在文件submit.js中,我有:

function verifyOrganizationString(organizationString) {
  db.one("select * from organizations where organization_string=$1", [organizationString])
    .then(data => {
        console.log("True!");
        return true;
    })
    .catch(error => {
        console.log("False!");
        return false;
    });
}

module.exports = {
  verifyOrganizationString,
};

在另一个文件中,我有

const submitModels = require('../models/submit.js');

function proccessSubmission(req, res) {
  var formInputs = req.body;
  console.log(submitModels.verifyOrganizationString(formInputs.organizationString));

  if (submitModels.verifyOrganizationString(formInputs.organizationString)) {
    submitModels.insertIntoDatabase(formInputs);
    res.redirect('/');
  } else {
    res.send("Invalid organization string");
  }

}

【问题讨论】:

  • 你需要明确你对 Promise 的概念,因为你正在非法地使用 Promise,这是一种反模式。记住一件事,从 .then.catch 中的任何一个返回的值只会被下一个链接的 .then.catch 访问,这是因为返回的值实际上是一个承诺。

标签: javascript node.js pg-promise


【解决方案1】:

您的问题是由于无效使用承诺和错误使用pg-promise

如果您希望函数根据是否找到记录返回true/false,请将函数更改为:

function verifyOrganizationString(organizationString) {
    return db.oneOrNone("select * from organizations where organization_string = $1",
                         organizationString, a => !!a);
}

然后你就可以像普通承诺一样使用它了:

verifyOrganizationString('bla-bla')
    .then(data => {
       // data = true/false
    })
    .catch(error => {
        // error
    });

另请参阅:SELECT ⇒ INSERT 示例。

【讨论】:

【解决方案2】:

您未定义的原因是因为“verifyOrganizationString”实际上并没有返回任何内容。您需要返回由您的 db.one 链创建的承诺。

虽然在这种情况下该方法仍然不会返回 true 或 false,但布尔值包装在另一个 Promise 中,这样您就可以像处理 db.one 的结果一样链接验证函数的结果。

【讨论】:

  • Chaining Queries 会更好吗?
  • @cpage 这与您损坏的代码无关;)您的问题是您滥用了承诺。你需要学习如何正确使用 Promise。
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多