- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我在index.js 中的一些代码。它等待人们访问 url.com/proxy,然后加载我的代理页面,这实际上只是一个发回电子邮件和代码的表单。从我的 MongoDB 数据库中,我使用代码获取用户订单,其中包含我需要的一些信息(例如产品和他们试图获取的消息)。由于某种原因,它似乎在获取此信息之前做出响应,然后在下次提交表单时保留它。
我的 res.send(product + '\n' + message) 中的换行符也不起作用,但这现在不是什么大问题。
但是..例如,我第一次填写表格时会得到空白回复。第二次,我将得到对第一个表格填写的任何内容的回复,然后第三次我将得到第二个回复。我对网络开发相当陌生,感觉我正在做一些明显错误的事情,但似乎无法弄清楚。任何帮助将不胜感激,谢谢。
app.get('/proxy', function(req,res){
res.sendFile(__dirname+ "/views/proxy.html");
});
var message = "";
var product = "";
app.post('/getMessage', function(req,res)
{
returnMsg(req.body.user.code, req.body.user.email);
//res.setHeader('Content-Type', 'text/plain');
res.send(product + "\n" + message);
});
function returnMsg(code, email){
MongoClient.connect(url, function(err, db){
var cursor = db.collection('Orders').find( { "order_id" : Number(code) })
cursor.each(function(err, doc){
assert.equal(err, null);
if (doc!= null)
{
message = doc["message"];
product = doc["product"];
}
else {
console.log("wtf");
// error code here
}
});
console.log(email + " + " + message);
var document = {
"Email" : email,
"Message" : message
}
db.collection("Users").insertOne(document);
db.close();
});
}
最佳答案
您需要大量阅读有关 Node.js 中的异步编程工作的内容。此代码存在严重的设计问题:
所有这些都会导致服务器根本无法正常工作。您已经发现了问题之一。您的异步响应在发送响应后完成,因此您最终会发送之前保存的响应而不是当前的响应。此外,如果多个用户正在使用您的服务器,他们的响应将相互影响。
这里的核心设计原则是,首先您需要学习如何使用异步操作进行编程。任何使用异步响应并希望将该值返回给调用者的函数都需要接受回调并通过回调传递异步值,或者返回一个 promise 并通过已解析的 promise 返回该值。然后,调用者需要使用该回调或 promise 在异步值可用时获取异步值,然后仅发送响应。
此外,与请求关联的所有数据都需要保留在请求句柄或请求对象的“内部”,而不是在任何模块级别或全局变量中。这可以防止一个用户的请求干扰另一用户的请求。
要了解如何从包含异步操作的函数返回值,请参阅 How do I return the response from an asynchronous call? .
<小时/>您的代码中最终发生的是以下事件序列:
/getMessage
的请求returnMsg()
res.send()
与 message
中之前的内容一起使用和product
变量。db.collection().find()
然后迭代 cursor
.message
中和product
变量(这些值一直保留在下一个请求到来之前)。在弄清楚你的代码应该如何实际工作时,你的逻辑中有一些不清楚的地方。您正在分配 message
和product
cursor.each()
里面。自 cursor.each()
是一个可以运行多次迭代的循环,其值为 message
和product
你真的想在 res.send()
中使用吗? ?
假设您想要最后一个 message
和product
来自您的cursor.each()
的值(value)循环,你可以这样做:
app.post('/getMessage', function(req, res) {
returnMsg(req.body.user.code, req.body.user.email, function(err, message, product) {
if (err) {
// send some meaningful error response
res.status(500).end();
} else {
res.send(product + "\n" + message);
}
});
});
function returnMsg(code, email, callback) {
let callbackCalled = false;
MongoClient.connect(url, function(err, db) {
if (err) {
return callback(err);
}
var cursor = db.collection('Orders').find({
"order_id": Number(code)
});
var message = "";
var product = "";
cursor.each(function(err, doc) {
if (err) {
if (!callbackCalled) {
callback(err);
callbackCalled = true;
}
} else {
if (doc != null) {
message = doc["message"];
product = doc["product"];
} else {
console.log("wtf");
// error code here
}
}
});
if (message) {
console.log(email + " + " + message);
var document = {
"Email": email,
"Message": message
}
db.collection("Users").insertOne(document);
}
db.close();
if (!callbackCalled) {
callback(null, message, product);
}
});
}
就个人而言,我会使用 Promise 并在数据库中使用 Promise 接口(interface),而不是回调。
<小时/>此代码仍然只是概念性的,因为它还有您需要处理的其他问题,例如:
insert.One()
这样的事情在继续之前先完成。关于node.js - res.send() 不发送当前响应,而是保留最后一个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809316/
我试图通过这段代码读取未知数量的整数: while (1) { int c = getchar (); if (c == EOF) break;
我正试图找到一个类似于谷歌分析日期选择器的日期选择器: 知道 jQuery 是否提供了类似的东西吗? 最佳答案 这个 Twitter Bootstrap 风格的日期范围选择器非常接近。 https:/
我正在使用 javascript。如何获取当前 URL 的路径并将其分配给我的代码?这是我的代码: $(document).ready(function() { $(".share").hides
如何获得今天的Julian day number (JDN)相等的?或任何日期? 我看了又看,但只发现了一些产生“year-dayOfYear”的函数,而不是:2457854。 最佳答案 在 bash
我有相当简单的 UDP 服务器写在 c 上。 有时我需要知道在套接字中排队的所有 udp 数据包(字节)的当前长度。 据我了解,getsockopt 没有得到这样的信息。 欢迎使用 Linux 和 F
我一直在寻找几个小时来找到一个可以在图像中添加诸如“填充:5px”之类的东西的插件。每个人都通过纯 html 做到这一点吗?我们的客户需要一种方法来简单地使用按钮或右键单击上下文菜单来添加它。有什么建
是否有可能获得当前正在执行的 TCL 脚本的完整路径? 在 PHP 中,它将是:__FILE__ 最佳答案 根据“当前正在执行的 TCL 脚本”的含义,您实际上可能会寻找 info script ,甚
我最近从直接使用 ISession 转向了包装的 ISession,即工作单元类型模式。 我曾经使用 SQL Lite(内存中)对此进行测试。我有一个简单的帮助器类,它配置我的 SessionFact
我按照步骤操作 here在 WebStorm 中配置代码完成和其他内容,但我仍然收到以下语法错误。 我该如何解决这个问题? 最佳答案 通过相应地将“JavaScript 语言版本”(Settings/
我可以为我团队的 TFS 当前 Sprint 任务板添加书签吗?我们有两周的冲刺,因此 URL 每两周更改一次。 默认 URL 的形式为: http://[Server]/tfs/[Project]/
是否有 Subversion 命令可以显示当前版本号? 在svn checkout之后,我想启动一个脚本并需要变量中的修订号。如果有像 svn info get_revision_number 这样的
我正在编写表单的一个组件 首次安装组件时,sources={{}} ,一本空字典。由于该组件包装了现有的 Javascript 库,因此我正在实现一个自定义比较函数。为了让这个 diffing 函数
无论系统时间设置为多少以及机器所在的时区,我都需要正确的 UTC 时间。 (即使我必须打电话到互联网才能同步......) 是否有一些库或其他方法可以优雅地做到这一点? 最佳答案 如果您想获得准确可靠
我一边编码,一边拿出一些我和 friend 建立的旧网站来重新开始工作。我已经有一段时间没有做过任何 AJAX 了,当我试图找出我的代码失败的地方时,我发现没有显示很多资源。我猜这是因为我使用的是旧方
由于对性能的巨大影响,我从不怀疑我现在的桌面CPU是否有分支预测。当然可以。但各种 ARM 产品又如何呢? iPhone或Android手机有分支预测吗?较旧的任天堂 DS?基于 PowerPC 的
我有一个具有以下有效负载的 JWT: { "id": "394a71988caa6cc30601e43f5b6569d52cd7f6df", "jti": "394a71988caa6cc30
从其他一些帖子中,我能够通过以下方式获取当前 URI: 但是以下方法不起作用: 我很好奇为什么上面的方法不起作用,以及如何将当前 URI 分配给字符串。 最佳答案 每the javadocs ,g
我在表格 View 中有几个单元格。现在在任何给定的时间点,我想计算 View 中单元格的当前高度,即如果它是 View 的 3/4,它应该返回 (cellheight)*3/4 高度。 我通过以下方
这是网站的身份验证脚本。这安全吗?是最近的节目吗?它已经过时了吗?是否有“更好更安全的方法”我很新,但我没有看到太多地方使用 header 授权。 如有任何帮助,我们将不胜感激!这是我制作的第一个登录
我已经在其他 stackoverflow 线程上检查过这个错误,但在我的代码中没有发现任何错误。也许我累了,但我觉得还好。 网站.urls.py: from django.conf.urls impo
我是一名优秀的程序员,十分优秀!