我有一个基本的Node JS服务器,它被设计用作API,我创建了一个日志和数据库模块,我已经开始添加其他模块来处理不同的请求类型.
我正在使用Express.js和node-mysql
当我访问时,/v1/group我收到以下错误 -
TypeError: Cannot read property 'database' of undefined
at Group.getAll (C:\code\javascript\node\api\api\v1\groups.js:12:23)
at callbacks (C:\code\javascript\node\api\node_modules\express\lib\router\index.js:161:37) ...
Run Code Online (Sandbox Code Playgroud)
所以我recieving的请求,并调用后猜测group.getAll()这this是不确定的,但我不明白为什么,有没有一种方法来设置this或已结构我我的应用程序都错了吗?
sever.js
"use strict";
var Express = require('express');
var Log = require('./database/log');
var Database = require('./database/database');
var dbConfig = require('./dbconfig.json');
var Group = require('./api/v1/groups');
//Init express
var app = new Express();
//Init log and database
var log = new Log();
var database = new Database(dbConfig, log);
var initCallback = function() {
//Init routes …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用节点中的node-mysql将多个值放入数据库.我的源代码
engine.files.forEach(function(file) {
torrentpath = file.path.replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'").replace(/\\/g, "/");
torrentFiles.push([
result.insertId,
torrentpath,
file.length
]);
});
console.log(torrentFiles);
app.mysql.query('INSERT INTO `files` (`torrentid`, `filename`, `filesize`) VALUES ?', torrentFiles, function(err, result) {
if (err) throw err;
});
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
[ [ 11, 'ubuntu-14.04-desktop-amd64.iso', 1010827264 ] ]
Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '11, 'ubuntu-14.04-desktop-amd64.iso', 1010827264' at line 1
at Query.Sequence._packetToError (C:\wamp\www\sleepytorrentdownload\src\node_modules\mysql\lib\protocol\sequences\Sequence.js:30:14) …Run Code Online (Sandbox Code Playgroud) tl; dr:使用带有ExpressJS的node-mysql处理MySQL数据库的两个或多个异步查询的正确方法是什么?
我使用带有node-mysql的ExpressJS在MySQL数据库上执行两个独立的,不相关的数据库查询.由于响应是异步的,我正在嵌套查询,这意味着它们最终会一个接一个地发生.
这似乎是一种丑陋,缓慢且通常不好的方法,特别是如果我要添加第三或第四个查询.
var mysql = require('mysql');
var credentials = {...}
router.get('/api/url/', function (req, res) {
return_data = {}
var connection = mysql.createConnection(credentials);
query1 = "SELECT column1 FROM table1 WHERE column2 = 'foo'";
query2 = "SELECT column1 FROM table2 WHERE column2 = 'bar'";
connection.query(query1, {}, function(err, results) {
return_data.table1 = results;
connection.query(query2, {}, function(err, results) {
return_data.table2 = results;
connection.end();
res.send(return_data);
});
});
});
Run Code Online (Sandbox Code Playgroud) Too many connections当 INSERT IGNORE INTO 循环中有很多项目时,我会收到错误消息。
function insertCases(cases) {
for(var i in cases) {
var thequery = 'INSERT IGNORE INTO `cases` SET keysused='+cases.keysused+'
pool.query(thequery, function(ee, rr) {
if(ee) {
logger.info(ee);
throw ee;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
当现在有 100 多个案例时,INSERT IGNORE INTO 比我获得太多连接的次数要多 100 次。我不知道它到底崩溃了多少,但有 100 次它就可以工作了。
我读到的是,该查询运行查询并在完成后关闭连接,所以我读到,我不需要在之后关闭它。
如果我运行 100,等待很短的时间并再次运行 100,依此类推,则不会出现连接过多的错误。
只有当一次运行这么多时间时。
这是我的数据库设置
var db_config = {
connectionLimit : 5000,
host: 'localhost',
user: 'userexample',
password: '*******',
database: 'example.com'
};
Run Code Online (Sandbox Code Playgroud)
这就是 createPool 的功能。
function database_connection() {
pool = mysql.createPool(db_config);
pool.getConnection(function(err, …Run Code Online (Sandbox Code Playgroud) 我想要做的就是插入一些数据,如果我的数据库没有,那么我将Insert SQL放入我的Select SQL的回调函数中,但是我得到了这样的错误:
{[错误:在调用quit后无法将查询排入队列.]代码:'PROTOCOL_ENQUEUE_AFTER_QUIT',致命:false}
我的代码片段在这里:
db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], function(error, result){
if (result[0].Resultcount == 0){
var query2 = db.query('INSERT INTO tablename SET ?', [post], function(err, result) {
if(err){
console.log(err);
}
console.log(result);
});
}
else{
console.log('have data already');
}
});
Run Code Online (Sandbox Code Playgroud)
有人可以给我一些建议吗?谢谢
---- ----更新
实际上,select SQL的回调函数不是一个匿名函数,我的db.end()代码片段是这样的:
var QueryResults = new queryResultFuntion(Back_results);
db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], QueryResults.queryResult );
db.end();
Run Code Online (Sandbox Code Playgroud) 我是node.js的新手,我想使用express和mysql数据库创建一个登录页面,请与我分享您的想法与示例.
在我的node.js,表达应用程序,我正在与superagent中间件进行ajax调用.该调用使用node-mysql中间件通过相当多的数据库查询来获取复杂数组中的数据库数据.
在粘贴代码之前,我试图用语言解释我想要做什么,尽管代码足以说明它想要做什么,并且第一次回调中的所有异步事件应该以同步方式完成.
说明:
在第一个查询的回调中,执行for循环以多次运行第二个查询,并且在每个循环之后,仅在第二个查询的回调完成后才调用下一个循环.下一个代码行的情况也是一样的.
码:
但是,您可以跳过 for循环的内部(在注释中标记),以便在需要时简化和简化.
conn.query("SELECT * FROM `super_cats`",function(error, results, fields) {
if(error){console.log("erro while fetching products for homepage "+ error);}
for(var i in results) { // FIRST FOR LOOP INSIDE THE FIRST QUERY CALLBACK
/*Innards of for loop starts*/
var elem = new Object();
var supcat_id=results[i].id;
elem.super_id =supcat_id;
elem.cats=new Array();
var cat= '';
/*Innards of for loop ends*/
conn.query("SELECT * FROM `categories` WHERE `supcat_id`="+supcat_id,function(error_cats, results_cats, fields_cats) {
if (error_cats) …Run Code Online (Sandbox Code Playgroud) 我相信这是相当明显的,对我来说,如果示例中的第二个双重问号是单个问号会更有意义.
从他们的文档:
或者,你可以使用?字符作为您希望转义的标识符的占位符,如下所示:
var userId = 1;
var columns = ['username', 'email'];
var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) {
// ...
});
console.log(query.sql); // SELECT `username`, `email` FROM `users` WHERE id = 1
Run Code Online (Sandbox Code Playgroud) 如果我创建一个包含4个worker(我的应用程序的4个实例)的节点集群应用程序,我应该使用mySQL池还是mysql池集群?如果我使用池,它将为每个应用程序创建一个池但如果我使用池集群,它将为每个应用程序创建4个池(总共16个).这是一个很好的实现还是会降低性能?
首先,让我们为mysql数据库创建配置文件(重要的是我创建db worker的这个文件的最后一部分):
DBconfig.js
'use strict'
const mysql = require('mysql'),
workers = process.env.WORKERS || require('os').cpus().length,
cluster = require('cluster');
//Local Database Settings
const local_settings = {
user : 'user',
host : '127.0.0.1',
password : 'pass',
database : 'dbname',
debug : false,
dateStrings: true,
connectionLimit : 10,
defaultSelector : 'RR',
multipleStatements : true,
removeNodeErrorCount: 1
};
let poolCluster = module.exports = mysql.createPoolCluster( local_settings );
//here I make one db worker for each app worker
for(let i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我可以理解每一个pool.query()都会花费一个连接,它会在结束时自动释放.基于这个关于github问题的评论.但是使用的嵌套查询pool.getConnection()呢?
pool.getConnection(function(err, connection) {
// First query
connection.query('query_1', function (error, results, fields) {
// Second query
connection.query('query_2', function (error, results, fields) {
// Release the connection
// DOES THIS ALSO RELEASE query_1?
connection.release();
if (error) throw error;
// you can't use connection any longer here..
});
});
});
Run Code Online (Sandbox Code Playgroud)
UPDATE
这是执行嵌套查询时使用事务的代码.
const pool = require('../config/db');
function create(request, response) {
try {
pool.getConnection(function(err, con) {
if (err) {
con.release();
throw err;
}
con.beginTransaction(function(t_err) {
if (t_err) …Run Code Online (Sandbox Code Playgroud) node-mysql ×10
node.js ×8
mysql ×6
express ×4
javascript ×3
asynchronous ×1
node-cluster ×1
sql ×1