关于nodejs的connection.query()方法异步特性问题 10C

最近在开发一个微信小程序,采用nodejs后台,在一个读取MySQL数据库并返回数据给前端的场景上遇到了问题,描述如下,忘各位高手相助。 先看代码:
module.exports = ctx=>{
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'wxb7e2f16d9e113148',
database: 'yhytest'
});
connection.connect();
var a='ini';
var sql = 'SELECT * FROM yhytesttable';
//查
connection.query(sql, function (err, result) {
if (err) {
a = err.message;
return;
}
a = result["0"].name;
});
ctx.state.data = {
msg: a
}
}
因为connection.query()是异步的,所以不等它返回结果,ctx.state.data就会先一步执行,从而无法获取从数据库查询回来的数据。而如果我把ctx.state.data的赋值写在connection.query()的响应函数里面,ctx.state.data可以被正确赋值,但返回到前端又显示data是空的。不知道是什么原因,希望各位可以提供思路,感激不尽~

0

2个回答

1
ye_s_3rd_chapter
生而彷徨 额,,那个帖子也是我发的
大约一年之前 回复

没用node写过小程序,但我用node写过自己的网站。我是这样处理的
connection.query(sql, function (err, result) {
if (err) {
a = err.message;
return;
}else{
if( result.length ==0 ){
res.send('读取数据的条件错误,因为正常读取,我的length不会是0').end()
}else{
a = result["0"].name;
ctx.state.data = {
msg: a
}
}
}

1)不知道你这里的result['0 ']是什么意思。如果是读取数组的第一项数据,直接读取就好,0不需要加引号
2)既然读取数据是异步的,那就等数据读取完了,在传数据

我用node做网站后台传数据是这样的
if( result.length ==0 ){
res.send('读取数据的条件错误,因为正常读取,我的length不会是0').end()
}else{
a = result["0"].name;
res.render(''/index.ejs',{data:a})
}

    希望对你有帮助。
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Async.js解决Node.js操作MySQL的回调大坑
由于JavaScript语言异步特性,在使用Node.js执行很多操作时都会使用到回调函数,其中就包括访问数据库。如果代码中的业务逻辑稍微复杂一点,回调一层层嵌套,那么代码很容易进入Callback Hell,无论对写代码的人还是阅读代码的人,都是精神上的折磨。
node.js在遇到“循环+异步”时的注意事项
nodejs的特征nodejs的最大特征就是一切都是基于事件的,从而导致一切都是异步的。nodejs的速度为什么快,其原理和nginx一样,他们都是通过事件回调来处理请求的,从而导致了整个处理过程中,不会阻塞nodejs,因此,其在同一时间内可以处理大量的请求,而这种优越性在你的请求是IO密集型的情况下,表现的尤为突出。下面的例子简单说明了基于异步事件的nodejs的处理流程:var send_da
Node.js 回调函数来解决SQL语句与返回值的异步问题
作为一个刚刚接触Node的菜鸟,面对Node的异步问题着实是头大。最近做一个前端的分页问题,原代码是顺序执行两条sql语句然后返回:rn client.query( //第一个sqln n 'SELECT * FROM products' ,n function selectCb(err, results, fields) { n if (err) { n thro
Nodejs教程23:使用async/await异步操作数据库
示例代码请访问我的GitHub:nhttps://github.com/chencl1986/nodejs-tutorialn使用co-mysql异步操作数据库n上一篇使用Node.js操作数据库,虽然能实现功能,但是异步操作需要不断写回调函数,代码严重冗余,而且阅读困难。n可以使用co-mysql,将query方法该写为返回一个Promise,就可以使用async/await进行异步处理。n我们...
自己发现的nodejs服务的问题--1查询语句的嵌套问题+接受的数据该怎么用
/**n * Created by 18468 on 2017/3/1.n */nvar http=require('http');nvar mysql=require('mysql');nvar qs=require('querystring');nhttp.createServer(function(req,res){n    res.writeHead(200,{'conten
nodejs连数据库时出现的异步问题
最近,在用nodejs连接mongoDB数据库时出现了一个特别蛋疼的问题,我们先来看代码 n下面我来解释一下代码——这个取名叫mongoB.js的文件主要实现监听来着客户端的post请求,这个请求是客户端页面通过window.onload方法再使用原生的XMLHttpRequest对象实现的。首先,js通过http模块监听指定端口,在获取到客户端请求的时候,通过判断参数来选择将要对数据库进行的操作—
nodejs mysql query 方法 第二个参数默认值
let db = {};nndb.pool = mysql.createPool({n            host     : this.config.host,n            user     : this.config.user,n            password : this.config.password,n            database : this.co...
关于Nodejs的单线程、异步IO与事件驱动的理解
        首先,nodejs如今越来越火,我记得有人做过实验,用node和php来做了性能对比(都是做后台的),答案是node是php性能的86倍!        nodejs最大的特点就是单线程、异步IO、事件驱动。(单线程是因为JS引擎中只有一个线程去解析和执行javascript代码,即主线程)        从接触编程之后,我遇到最震撼的也是最难学就是多线程编程,我在想只有多线程编程...
实战学习NodeJS建站(4)—封装 SqlClient 实现对MySql的访问
1、db_config.jsn首先,对数据库的访问需要配置数据库连接参数:host、port、用户名、密码; n/**n* 需要安装mysql组件n* 类似于安装express,执行:npm install mysql 即可;n* 在node_modules 目录下多出 mysql 模块n*(或者从其他项目中拷贝进来也可以)n*/nvar mysql = require('mysql');nv
nodejs解决异步问题
      nodejs作为使用Javascript为主要开发语言的服务器端编程技术和平台,而她最有特色的便是异步IO和事件驱动。而往往在我们进行编程的时候,就是会想着一些同步事件进行,比如说一个函数中可能出现闭包或者文件读取操作之类的问题就会引起异步进行,那么有办法让我们的程序按照我们想要的顺序进行吗?答案肯定是有的!!!       在接触一些nodejs编写的项目中,就碰到过这种问题,然后所...
nodejs学习笔记二:闭包和异步编程
闭包到底是什么鬼闭包就是函数��,但是它可以继承并访问它自身被声明的那个作用域里的变量。当你将一个回调函数作为参数传递给另外一个进行i/o操作的函数时,回调函数稍后会被调用,神奇的是,在被调用时,回调函数会记住它自身声明时所在的上下文,并且可以访问该上下文及其父上下文里的所有变量,这个强大的特性就是Node成功的核心。举个简单的jquery例子: (function(){n va
nodejs异步变同步的几种方式
async库,es6的promise-then,es7的await-asyncnn1. nodejs的async库,有好多种方法支持异步变同步的,常用的有:nnasync.each(): for循环中牵涉到异步变同步,经常使用。nnasync.waterfull(): 同步执行,function之间有数据交互,上一个function的输出,可作为下一个function的输入。nnasync.ser...
nodejs之代码操作mysql(直连和连接池连接mysql)\mysql权限操作
mysql权限:http://blog.csdn.net/anzhen0429/article/details/78296814npm的mysql地址:https://www.npmjs.com/package/mysql====================直连mysql========================var router = function(app){n app.get(...
NODE.JS async异步调用之串行化调用
异步是node.js绕不开的话题,推荐使用async 来处理nasync支持常见的 程序流程控制,串行执行,并行执行,流水线执行等n这篇介绍最常用的串行化调用nn串行化调用场景:先刷牙洗脸 再吃早餐。ntypescript 中使用nnimport async from 'async-es';nnode.js使用nvar async =requie('async');n格式一:把任
解决nodejs异步问题
n n n nodejs 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高nnodejs的每一个api都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发n我们经常使用的File的readFile事件就是一个并发事件。nconsole.log("1");nfs.readFile("mime.json",function (err,data...
nodejs中解决异步嵌套循环,循环嵌套异步
nodejs中解决异步嵌套循环,循环嵌套异步
nodejs async之waterfall接口連續多次查表最終返回結果
async之waterfall:async.waterfall(tasks,callback)瀑布流函數,串行依次執行数组中函数,直至回調。参数tasks為數組,其包含需依次執行之函數。第二个参数為回調函數,有誤則行之以饋其錯,無誤則tasks完畢後行之。var async = require('async');nconst mysql = require ('mysql');nvar mysql...
NodeJS 异步操作:更为优雅的实现:thenjs
在上一节中,我们实现了批量文件读取,即循环异步函数的并发和有序操作。 n总结为: n 并发操作可以在Array.forEach 和 Array.map 中进行; n 有序操作则在循环中对Promise加入await关键字,意味着同步等待结果,并用async修饰整个函数;由于需要实现在批量读取完成后回调的功能,例如提示操作完成,统计结果等,我们需要在每个循环中判断是否读取到了最后一个 n文
node+express中用async来避免sql嵌套
在写一个自己的小项目的时候发现如果逻辑稍微复杂一点,就会陷入很多的嵌套中,这也就是所谓的回调地狱。以前的写法可能是这样nnnconn.query('sql',function(err,data){n if(err) {n console.log(err);n }else {n conn.query('sql',function(err,data){n if(err) {n co
nodejs mysql 执行多条sql语句
执行多条查询语句rnrn为了安全起见,默认情况下是不允许执行多条查询语句的。要使用多条查询语句的功能,就需要在创建数据库连接的时候打开这一功能:rnrn rnvar connection = mysql.createConnection( { multipleStatements: true } );rnrn rnrn这一功能打开以后,你就可以像下面的例子一样同时使用多条查询语句:rnrn rn
Node.js的那些坑(四)——如何让异步并发方法同步顺序执行
虽然上一篇用Promise.all()的方法解决了Node.js中异步方法全部执行完毕后再执行的问题,n但如果想让异步方法按顺序执行还是不行。n本篇用迭代的方式给出异步并发方法同步顺序执行的解决方案。
NodeJS 异步变同步的方法遍历文件夹
var fs = require("fs");nvar dirArr = [];nn/***n使用异步变同步的方式。n使用类似递归的方式去做,在内部创建一个iterator的函数n**/nnfs.readdir("./Dir",function(err,files){ n (function iterator(i){n n if(i == files.length) return ;
node.js面试题大全-侧重后端应用与对Node核心的理解
Node是搞后端的,不应该被被归为前端,更不应该用前端的观点去理解,去面试node开发人员。所以这份面试题大全,更侧重后端应用与对Node核心的理解。 github地址: https://github.com/jimuyouyou/node-interview-questions 起源 node正风生火起,很多介绍却停留在入门阶段,无法投入生产 node相关的高质量面试题更是少之又少,很难全面考查应聘者的node能力 许多文章在讲第三方类库,可是这些库质量差距较大,一旦遇到问题怎么办 必需的,全面了解node核心才能成为一名合格的node开发人员 目标与原则 前后端兼顾,更侧重后端 理论实战兼顾,侧重考察对实战中应用较多的理论的理解 参考答案简单明了,一针见血,不为追求严谨而浪费口舌,绕弯子 尽量用代码讲清理论的应用与区别,以接地气 终极目标是让大家对node有一个快速完整的认识 内容大纲 javascript高级话题(面向对象,作用域,闭包,设计模式等) node核心内置类库(事件,流,文件,网络等) node高级话题(异步,部署,性能调优,异常调试等) 常用知名第三方类库(Async, Express等) 其它相关后端常用技术(MongoDB, Redis, Apache, Nginx等) 常用前端技术(Html5, CSS3, JQuery等)
nodeJS单线程异步非阻塞特性
单线程会造成多个用户抢占cpun先来后到进入事件队列nIO操作进入线程池,由线程池接管,主线程继续执行其他任务,当IO操作执行完毕,发出中断信号,进入事件队列nNODE这个机制让NODEJS可以让NODE单线程异步执行n因为IO不由主线程管理,也就不会阻塞nn...
Nodejs中控制异步的几种方法【陆续更新……】
1.异步回调原生写法nnserverClient.get("http://localhost:3001/test/test.php?page=1&page_count=1", function (err,res,data1) {n // somethingn serverClient.get("http://localhost:3001/test/test.php?page=2&p
nodejs 异步I/O和事件驱动
nodejs 异步IO和事件驱动n几个例子nexample 1nexample 2nexample 3nexample 4nexample 5n异步IOasynchronous IOn阻塞IO 和 非阻塞IOn同步IO 和 异步IOn事件驱动n线程驱动和事件驱动nnodejs的事件驱动和异步IOn事件驱动模型n异步IOn问题答案nnodejs 异步I/O和事件驱动n 注:本文是对众多博客的学习和总
NodeJS的异步、并发编程方案
一、事件发布/订阅模式(events)nn事件发布/订阅模式自身并无同步和异步的问题,但在node中,emit()调用多半是伴随时间循环而异步触发的。 n订阅:nnemitter.on("event1", function(message){n console.log(message);n});nn发布nnnnemitter.emit("event1&a
node 异步与同步读取文件
demo2.js 异步nvar fs = require("fs");n//异步读取文件nfs.readFile("wen.txt","utf-8",function(err,fd){n if (err) {n console.error(err);n throw err;n }n console.info(fd);n});nconsole.info("文件读取成功··");nnnnd
Node.js的那些坑(三)——如何在异步方法都执行后再执行
在异步方法执行后再执行的直接解决方案就是写回调。n可是如果想让所有的(例如循环调用的若干次)异步方法全部执行完之后再执行接下来的方法该怎么办呢?n本文基于Promise语法,给出解决方案。
关于对Node.js的“单线程非阻塞异步I/O”特点的个人理解
关于Node.js的运行机制的个人理解:n(1)当发起一个异步(非阻塞或阻塞)调用时,就会封装异步调用的请求对象。n(2)封装完后的对象就会放入线程池内等待执行。n(3)当线程池查询有空时就会执行请求对象里面的I/O操作,执行完之后就会把结果封装到请求对象中并通知事件循环中的I/O观察者。n(4)I/O观察者就会取出请求对象的结果(也就是回调函数)进行执行。nnn每个特点的体现:
NodeJs 畅谈异步
我们都知道NodeJs是基于事件回调处理事件的,那我们经常会有这样的疑问,比如我们会使用db或者redis或者fs等模块去存储我们的信息,当我们需要实时返回一个数据并作出处理的时候,异步的通知显得不是那么人性化了,此时我们需要将异步变成同步,在此过程中我们有这样几个知识点要掌握以下,包括JavaScript中的生成器generartor函数,配合它的是yield关键字的暂停,thunk和promi
关于node数据库操作的异步问题以及其中的一些小坑
最近在做毕业设计,后端用的node以及Mongo数据库。因为node的异步问题,遇到了一些小坑,虽然不是什么大问题,很快就解决了,在这里与大家分享一下,避免大家走不必要的弯路。废话不多说,直接上代码。nnnconst Monk = require('monk');nconst db = new Monk('localhost/Graduation_project'); // 链接到...
nodejs异步回调造成的困扰
现存在如下图所示的文件目录: n n我们希望通过02.js来实现能够静态加载static中的文件 n这篇博客是我的上一篇博客静态资源管理续篇,在上一篇博客中,因为遇到加载json格式的文件遇到了问题,所以写了一个续篇,如果有感兴趣的小伙伴可以看一下 n实现代码如下:var http = require('http');nvar url = require('url');nvar fs = requi
保持nodejs健状性,异步函数错误处理方法Domain与try.catch的区别
保持nodejs健状性,异步函数错误处理方法Domain与try.catch的区别n 首先看看try..catch处理错误方法n// 同步函数异常ntry {n errorObject()n} catch(error) {n console.log(error)n console.log(1)n}function errorObject() {n var i = wrong
nodejs 单线程,异步回调,事件
一直都说nodejs是单线程,采用事件异步回调的机制,达到非阻塞。一直很不是很理解,最近有点心得。 n首先说说啥是单线程和多线程两者的区别: n单线程可以理解为任务制,在当前任务的时候要等待当前任务的结束才能进行下一个任务。而多线程可以有多个任务。两者各有优缺点。可以理解为“谈恋爱”,单线程就是传统的只能有一个女朋友,然后想要一个新的女朋友必须要和当前的女朋友分手才能谈新的女朋友。那多线程呢就是可以
nodejs中使用async来对异步操作进行同步,避免多个异步同时启动引发连接错误
/*n 对于nodejs中由于几乎大部分的操作都是异步的,所以我们都是通过一层层的函数来实现。n 而异步也会带来一些问题,那就是同时并发过度的request,就会导致链接失败(或则连接被关闭)n 如何做到既能异步操作,又能控制并发数目,asyn库应该是可以满足需要n */nconst url = require('url');nconst request = require('request');
几行代码搞定nodejs中的回调坑
方法如下nfunction sync(gen){n var genObj = gen(resume);n function resume() {n genObj.next(arguments);n }n genObj.next();n}nnn文件读取实例napp.get('/fsdemo', function (req, res) {n "u
nodejs 异步io 解决for循环最佳方案
node js 异步io 解决for循环最佳方案
NodeJs中ReadStream的pipe操作在异步调用中的问题
n n n 今天,准备用nodejs的request模块去爬取需要的图片,在存储图片的时候遇到了一个问题:nn由于存储图片的文件夹可能不存在,所以需要先用 fs.stat方法判断文件夹是否存在。但是,这里是个异步操作,也就是由于这个判断,输出的图片始终没有数据。大小size是0nn具体的情形可以用下面的代码来描述nlet fs = require("fs");nlet...
NodeJS中的异步I/O、事件驱动
nodejs的主要特点是单线程、异步I/O、事件驱动。让我们先大概了解一下这些名词的意思。单线程单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行。在JS引擎中负责解释和执行Javascript代码的线程只有一个,即主线程。但实际上还存在其他的线程。例如处理AJAX请求的线程、处理DOM事件的线程、定时器线程、读写文件的线程等。这些线程可能存在与JS引擎
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于大数据培训 关于云计算