繁体   English   中英

Nodejs接收来自我的ajax前端的多个请求

[英]Nodejs recieving multiple requests from my ajax frontend

出于某种原因,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>
         &nbsp;
         <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&nbsp;</p>
         &nbsp;
         <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">&nbsp;BTC&nbsp;&nbsp;</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)
    });

});

我相信浏览器会超时并再次提出请求以恢复(我以前见过这种情况发生在我身上)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM