javascript - Nodejs 从我的 ajax 前端接收多个请求
问题描述
出于某种原因,Ajax 不断向我的快速后端发送 get 和 post 请求。
例如,当我创建一个新订单时,有时它会发送该请求两次或三次,并多次创建该订单。或者当我想查看一种货币的实时价格时,它会一遍又一遍地发送 GET 请求。
示例 1:获取货币价格
这是我的前端 javascript:
function getSymbolPrice(exchange, symbol) {
$.ajax({
url: '/getSymbolPrice/' + exchange + '/' + symbol,
method: 'GET',
contentType: 'application/json',
success: async function (response) {
symbol_price = parseFloat(response.price);
}
});
}
我的后端:
app.get('/getSymbolPrice/:exchange/:symbol', isLoggedIn, async function (req, res, next) {
var exchange = req.params.exchange;
var symbol = req.params.symbol;
var url;
if (exchange.toLowerCase() == "binance") {
url = 'https://api.binance.com/api/v1/ticker/price?symbol=' + symbol.toUpperCase();
}
if(symbol.toUpperCase() != "NULL") {
await request({
uri: url,
json: true
}, function (error, response, body) {
if (error) {
console.log(error);
} else if (!error && response.statusCode === 200) {
//console.log(body);
res.send(body);
} else {
console.log(response);
}
});
}
});
示例 2:发布新订单 前端 html
<form id="market_order_buy_form">
<fieldset>
<div class="d-flex m-0 w-100 mb-2">
<p class="p-0 m-0 blue-text text-format-08 justify-content-start">BUY</p>
<p class="p-0 m-0 blue-text text-format-08 mr-auto exchange_balance_base_symbol">BTC</p>
<p class="p-0 m-0 text-color text-format-08 exchange_balance_quote"> 865 </p>
<p class="p-0 m-0 blue-text text-format-08 exchange_balance_quote_symbol">USDT</p>
</div>
<div class="input-group input-group-sm mb-2 disabled-cursor">
<input type="text"
class="form-control light-border text-format-08 text-color box-color-bg disabled"
value="Market Price" id="initial_market_buy_price">
<div class="input-group-append">
<span class="input-group-text text-format-08 text-color light-border light-box-color-bg"
id="initial_market_buy_price_symbol">USDT</span>
</div>
</div>
<div class="input-group input-group-sm mb-2">
<input type="text"
class="form-control light-border text-format-08 text-color box-color-bg"
placeholder="Quantity" id="initial_market_buy_quantity">
<div class="input-group-append">
<span class="input-group-text text-format-08 text-color light-border light-box-color-bg"
id="initial_market_buy_quantity_symbol"> BTC </span>
</div>
</div>
<div class="d-flex align-self-end m-0 w-100 mb-0">
<button type="button" class="btn btn-sm btn-default waves-effect w-100 py-2 m-0 mr-auto initial_market_buy_btn" onclick="submit_bot_order()">BUY</button>
<div class="form-check pl-2 pl-0 initial_buy_checkbox" style="display: none">
<input type="checkbox" class="form-check-input" checked disabled>
<label class="form-check-label text-format-08"></label>
</div>
</div>
</fieldset>
</form>
前端 JavaScript
function submit_bot_order() {
var trade = {}; // data from input fields
$.ajax({
url: '/createBotOrder/' + $('#accounts').val(),
method: 'POST',
contentType: 'application/json',
data: JSON.stringify(trade),
success: function (response) {
alert(response);
}
});
setTimeout(refresh_fields, 2000); //just resets all fieldsets
}
Nodejs 后端
app.post('/createBotOrder/:account', isLoggedIn, function (req, res, next) {
User.findById(req.user._id, function (err, doc) {
if(err){
console.log(err);
}
for (var i in doc.user.exchange_accounts) {
if (doc.user.exchange_accounts[i]._id == req.params.account) {
req.body.keys = [doc.user.exchange_accounts[i].initialize.api_key, doc.user.exchange_accounts[i].initialize.secret_key, doc._id, doc.user.exchange_accounts[i]._id];
}
}
new_order.initialize_trade(req.body);
});
});
解决方案
看起来您没有在所有后端流程中发送响应。例如,在 中,您至少/createBotOrder/:account
应该包括。res.sendStatus(200)
当您找不到用户时,您还应该返回响应:
app.post('/createBotOrder/:account', isLoggedIn, function (req, res, next) {
User.findById(req.user._id, function (err, doc) {
if(err){
console.log(err);
return res.sendStatus(404);
}
for (var i in doc.user.exchange_accounts) {
if (doc.user.exchange_accounts[i]._id == req.params.account) {
req.body.keys = [doc.user.exchange_accounts[i].initialize.api_key, doc.user.exchange_accounts[i].initialize.secret_key, doc._id, doc.user.exchange_accounts[i]._id];
}
}
new_order.initialize_trade(req.body);
res.sendStatus(200)
});
});
我相信浏览器正在超时并再次发出请求以恢复(我以前见过这种情况)。
推荐阅读
- java - 将 WildFly 从 8 升级到 14 java.sql.SQLSyntaxErrorException: ORA-02275: 这样的引用约束已经存在于表中
- html - 每当我在导航栏中创建活动选项卡链接或按钮时,它都会在文本后添加一个减号
- ios - 为什么根据 superview 在 willMove(toSuperView) 方法中没有正确设置自动布局约束
- scala - 在Scala中将json对象的字符串转换为数组
- rest - API 返回并忽略的数据会发生什么情况
- python - 使用 python 和 pandas 处理日期和时间
- python - 遍历日期列表并计算每个间隔之间的天数
- c++ - 如何使用 cmake 自动匹配所有子目录
- html - 如何将两个 div 对齐?
- windows-installer - 以编程方式检测正在安装的 MSI 包