如果我们不在节点js中关闭或结束mysql连接,它是否会影响功能.
我这样做
var mysql = require('mysql');
var connection = mysql.createConnection(...);
connection.query('SELECT 1', function(err, rows) {
// connected! (unless `err` is set)
});
Run Code Online (Sandbox Code Playgroud)
我的代码中的任何地方都没有结束mysql连接.我的问题是是否有必要关闭mysql连接.如果我们不关闭mysql连接将来我将面临任何其他问题.
请帮助我对nodejs不熟悉
EDIT1 我不会遇到任何问题,如无法连接,太多连接打开等,意味着任何资源相关的问题?对.
EDIT2
如果我们不手动结束或使用结束函数,那么即时mysql连接将关闭?
我正在发现Nodejs和node-mysql模块.我有一个小问题.我找到的每个教程都解释了如何对数据库进行选择,但它们永远不会返回行,它们总是记录它们,这对我的情况来说绝对没用.
我有一个app.js文件:
// Get continents
app.get("/continents", function(request, result) {
console.log("Continents : " + database.findAllContinents());
});
Run Code Online (Sandbox Code Playgroud)
和一个mysql.js文件:
exports.findAllContinents = function(connection) {
var connection = getConnection();
connection.query('select id, code, name from Continent', function (err, rows, fields) {
if (err) {
console.log("Error in findAllContinents : " + err)
}
return JSON.stringify(rows);
});
closeConnection(connection);
};
Run Code Online (Sandbox Code Playgroud)
如何让函数返回行以在app.js文件中使用它们?我真的不想在app.js文件中创建连接我想要分离DAO层.你有什么主意吗 ?
此外,如果有人知道使用node-mysql而不是ORM(sequelize,persistence.js ......)的优缺点
谢谢
我全力以赴,仅使用节点做项目.它很有趣,但有时我会迷失一点,我想在我感到困惑的时候尝试获得理解,所以我正确地构建它并且不要太过于不知所措.无论如何,这是问题所在:
我有使用Express和mysql的REST API.我设置了mysql:
//Variables, move these to env
var dbOptions = {
host: config.db_config.host,
user: config.db_config.user,
password: config.db_config.password,
port: config.db_config.port,
database: config.db_config.database
};
app.use(myConnection(mysql, dbOptions, 'single'));
Run Code Online (Sandbox Code Playgroud)
然后我包括我的路线,传递路线应用程序和登录中间件,以便我可以在路线中使用它们:
var userRoute = require('./routes/users.js')(app,log);
app.use('/users', userRoute);
Run Code Online (Sandbox Code Playgroud)
这实际上有点令人困惑,但现在我明白了,我必须将它们传递给模块才能让模块获取数据.
然后在我的路径文件中,我想使用一个对象,以便我可以在其他路由中使用相同的功能,但在用户文件中,为了使用其他所有使用的相同连接池,或者至少不必设置再次连接我必须传递响应和请求?必须有一个更好的方法来做到这一点.这样真的很难看.这是相关部分
var User = require('../controllers/User.js');
module.exports = (function(app,log) {
var userR = express.Router();
userR.post('/register', function(req,res){
var email = req.body.email;
var password = req.body.password;
var firstName = req.body.first_name;
var lastName = req.body.last_name;
var userId;
try {
var query;
var status = 200; …Run Code Online (Sandbox Code Playgroud) 我试图在节点中的现有连接中更改数据库.连接可能有也可能没有createConnection调用数据库名称.这是代码:
var mysql = require('mysql');
connection = mysql.createConnection( {
host : 'localhost',
user : 'me',
password : 'secret',
port : 3306,
/* database : 'test' // optional */
});
Run Code Online (Sandbox Code Playgroud)
我正在使用node-mysql lib.目前我正在关闭连接并重新连接.
有没有更好的方法呢?类似于mysql_select_dbPHP?
我有一个数组'flag',我在我的函数中更改了该数组的值.现在我需要将其更新到数据库中,但我无法这样做.我已经在表格中有标志列.我不知道如何更新表中变量标志的值
如果我试试
connection.query('UPDATE visentry SET flag = "flag" ', function(err,rows,fields) { }
Run Code Online (Sandbox Code Playgroud)
它使用值标志更新列标志.如果我尝试以下
var sql = 'UPDATE visentry SET flag= ?';
connection.query(sql,[{flag:flag}], function(err,rows,fields) {
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误
错误:ER_PARSE_ERROR:您的SQL语法中有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的''附近使用正确的语法
请给我任何建议
我正在建立一个用户将标签与帖子关联起来的系统,与SO不同.我有一个懒得实现标签同义词的地方.
这里我有一个名为Tags的表:
| TagName |
|------------|
| Python |
| JavaScript |
| Node |
Run Code Online (Sandbox Code Playgroud)
我有另一个名为TagSynonyms:
| SynonymId | SourceTagName | TargetTagName |
|-----------|---------------|---------------|
| 1 | Py | Python |
| 2 | Python2 | Python |
Run Code Online (Sandbox Code Playgroud)
服务器使用Node实现,用户以逗号分隔的字符串输入一些标签:
var input = 'Py,Flask'
var tags = request.tags.split(',');
Run Code Online (Sandbox Code Playgroud)
在这种情况下,用户输入了标签Py,根据TagSynonyms表,它应该映射到标签Python.第二个标签,Flask没有同义词,应该保持不变.
我设法使用命令式代码实现此功能:
tags.forEach(function (tag) {
connection.query('SELECT TargetTagName FROM TagSynonyms WHERE SourceTagName = ?', tag, function(err, rows) {
if (rows.length …Run Code Online (Sandbox Code Playgroud) 我不知道为什么mysql.end()或mysql.destroy()不能像我期望的那样工作.这是我的代码.
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'db',
password: ''
});
connection.connect();
connection.query('SELECT * FROM ofertas ', function (err, rows, fields)
{
if (err) console.log(err);
else
{
console.log(rows);
}
});
connection.destroy(function (err)
{
if (err) throw err;
});
Run Code Online (Sandbox Code Playgroud)
我执行此代码,然后我转到mysql命令行,我输入:
show status like 'Conn%';
Run Code Online (Sandbox Code Playgroud)
在节点代码之前
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | 3 |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)
节点代码之后
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | 4 |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)
connection.state ='已断开' …
我有两个问题.
首先,
SELECT auctions.name, wowitemdata.itemName, auctions.itemId,
auctions.buyout, auctions.quantity
FROM auctions
INNER JOIN wowitemdata ON auctions.itemId = wowitemdata.itemID;
Run Code Online (Sandbox Code Playgroud)
返回这样的数据:
{
name: 'somename',
itemName: 'someitemname',
itemId: '0000',
buyout: '0001',
quantity: '5',
}
Run Code Online (Sandbox Code Playgroud)
第二个查询使用来自#1的数据来获得比itemId便宜的项目的count().响应将作为新元素添加到#1 - >'undercut'.
我的功能:
function checkUndercut(data, length){
var Select = 'SELECT COUNT(auctions.itemId) AS cnt ';
var From = 'From `auctions` ';
var Where = 'WHERE auctions.itemId LIKE ? AND buyout < ?';
var sql = Select + From + Where;
for(i = 0, len = length; i < len; i++){ …Run Code Online (Sandbox Code Playgroud) 我正在使用MySQL 5.7与Node JS 6.11.0,并且UNIQUE每当我插入冲突的行时我都会尝试更新MySQL列.但是,当我尝试插入冲突的记录时,只更新现有记录NULL而不会insert发生.这是我的代码
pool.getConnection(function(err, connection) {
var newClass = req.body;
var query = `INSERT INTO classes SET ? ON DUPLICATE KEY UPDATE teacher_id = NULL`;
connection.query(query, newClass, function(err, result) {
console.log(result);
if(result.affectedRows >= 1) {
res.status(201).end();
res.json(result);
}
});
connection.release();
});`
Run Code Online (Sandbox Code Playgroud)
我必须为要插入的行运行两次查询; 第一次将冲突列设置为null,然后当我再次运行相同的查询时,将插入该行,因为没有冲突.
我已经生成了SQL并从MySql控制台直接运行它,我仍然需要为要插入的新行运行两次查询.我不明白为什么这样做.
Sql语句是
INSERT INTO classes SET `stream` = 'Red', `form` = '1', `teacher_id` = '7' ON DUPLICATE KEY UPDATE teacher_id = NULL
Run Code Online (Sandbox Code Playgroud)
我的创建表SQL是
| classes | …Run Code Online (Sandbox Code Playgroud) 我想使用docs 中解释的getServerSideProps方法使用 Next.js 进行服务器端渲染。
数据应该来自数据库,所以我使用的是mysql包。这会导致以下错误:
Error serializing `.assertions[0]` returned from `getServerSideProps` in "/assertion". Reason: `object` ("[object Object]") cannot be serialized as JSON. Please only return JSON serializable data types.
Run Code Online (Sandbox Code Playgroud)
我认为这是因为query方法 frommysql返回特殊对象 ( RowDataPacket)。getServerSideProps记录时我想传递给的结果如下所示:
[ RowDataPacket { id: 1, title: 'Test' } ]
Run Code Online (Sandbox Code Playgroud)
我可以通过包装结果来解决这个错误,JSON.parse(JSON.stringify(result))但这对我来说似乎很奇怪。
所以,我的简单的问题是:如何使用mysql.query和getServerSideProps是否正确?
或者这可能是一个应该解决的问题Next.js?
谢谢
node-mysql ×10
node.js ×9
mysql ×6
javascript ×2
express ×1
next.js ×1
node-modules ×1
oop ×1
rest ×1
select ×1
sql ×1