javascript - Why is my module function returning undefined in node.js?
问题描述
So, I wanted to move all my mysql query functions to another file and import it as a module, but I'm having trouble in that the function is returning undefined.
index.js:
const express = require('express')
const https = require('https');
const fs = require('fs');
const dbx = require('./databaseconn');
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/example.com/cert.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/example.com/chain.pem')
};
const app = express();
app.use(express.json());
app.use(function(req,res,next) {
if (req.body.action) {
switch (req.body.action) {
case "login":
var user = req.body.username;
var pass = req.body.password;
console.log(dbx.checklogin(user, pass)); // This prints undefined
break;
default:
break;
}
}
});
https.createServer(options,app).listen(8000);
databaseconn.js:
const mysql = require('mysql');
exports.checklogin = function(username, password) {
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'xxxxxxxxxxxxxx',
database : 'users',
});
connection.query('select * from logins where username = ? and password = ?;',
[
username,
password
], function (err, rows, fields) {
if (err) throw err;
if (!rows.length) {
console.log('0');
return {"success":0};
} else {
console.log('1'); // THIS PRINTS
return {"success":1}; // So this should return the JSON
}
})
}
So I see a "1" from the console.log in the databaseconn.js, but the console.log in the index.js file is printing undefined. What am I doing wrong? I also did a super barebones test that works fine so I can't see the difference.
test.js:
const express = require('express');
const test2 = require('./test2');
var t = test2.test();
console.log(t);
test2.js:
exports.test = function() {
return {"success":1};
}
解决方案
console.log
模块内的语句index.js
打印undefined
,因为模块内的checklogin
函数databaseconn.js
不返回任何内容({"success":1}
是内部匿名函数的返回值checklogin
,但它不是checklogin
自身的返回值)。
如果你想在模块内部处理查询结果,你可以从模块index.js
传递一个回调,它可能如下所示:index.js
databaseconn.js
index.js:
app.use(function(req, res, next) {
if (req.body.action) {
switch (req.body.action) {
case "login":
var user = req.body.username;
var pass = req.body.password;
dbx.checklogin(user, pass, function(err, rows, fields) {
console.log('Here you can handle the query result')
});
break;
default:
break;
}
}
});
数据库连接.js:
exports.checklogin = function(username, password, callback) {
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'xxxxxxxxxxxxxx',
database : 'users',
});
connection.query('select * from logins where username = ? and password = ?;',
[
username,
password
], callback)
}
推荐阅读
- php - PHP MS SQL Get Tables Velues 即使某个表在另一个表中没有值
- jquery - 切换/隐藏的jQuery问题
- java - 国家/地区本地 TZD 格式的纪元时间戳
- facebook - 单击链接在 Facebook 上分享一些文字
- c++ - 如何在编译时记录驱动器的卷标?
- regex - 用于远程日志记录条目的 Grep syslog 配置
- apache-spark - 在 Spark 中导入具有不同列数的文本文件
- anylogic - Anylogic 的 Agent 人口和 SD 住房示例中的 Add_people() 函数
- scala - 从 Neo4j Scala 获取记录值
- javascript - Javascript 客户端验证不起作用 ASP.Net