gpt4 book ai didi

node.js - 我无法从 Node.js 中的自定义模块接收数据

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:17 24 4
gpt4 key购买 nike

我编写了一个名为 accountManager.js 的模块

var sqlite3 = require('sqlite3');

var db = new sqlite3.Database("./users.db");

exports.userExists = function userExists(nickName) {
var stmt = 'SELECT * FROM users WHERE login="' + nickName + '"';
db.each(stmt,function(err,row) {
if(row) {
if(row.login==nickName) return true;
else return false;
}
});
}

在我的主 app.js 文件中

var accountManager = require('./lib/accountManager');
console.log(accountManager.userExists('user1'));

这个应用程序在控制台中显示“未定义”...我检查了该模块工作正常,我猜这是回调问题?请给我一些帮助,我不明白这段代码有什么问题......

最佳答案

您需要了解异步函数和回调的工作原理。

基本上,您无法在回调中返回任何内容,但需要调用传递给 userExists 的另一个回调。

var sqlite3 = require('sqlite3');
var db = new sqlite3.Database("./users.db");

exports.userExists = function userExists(nickName, cb) {
var stmt = 'SELECT * FROM users WHERE login="' + nickName + '"';
db.each(stmt,function(err,row) {
if(row) {
cb(row.login == nickName);
}
});
}

使用它:

accountManager.userExists('user1', function(found) {
console.log(found);
});

除此之外,您的代码存在一个巨大的 SQL 注入(inject)漏洞,并且可能无法执行您想要执行的操作。这是 userExists 函数的固定版本:

exports.userExists = function userExists(nickName, cb) {
var stmt = 'SELECT COUNT(*) AS cnt FROM users WHERE login = ?';
db.get(stmt, nickName, function(err, row) {
cb(row.cnt > 0);
});
};

为什么这样更好?

  1. 您不会在 SQL 字符串中插入值(这很糟糕,您必须转义内容以避免 SQL 注入(inject))。单独传递它更干净、更好
  2. 您只想知道用户是否存在。因此检索计数(这将恰好是一行)。如果不为零,则用户存在。
  3. 现在回调总是被调用。在第一个更接近于您的代码的示例中,只有在找到用户的情况下才会调用它 - 很可能不是您想要的。

关于node.js - 我无法从 Node.js 中的自定义模块接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com