gpt4 book ai didi

node.js - 返回值,或停止脚本

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:04 27 4
gpt4 key购买 nike

你好,我在Windows Azure Mobile服务中创建API,在这个api脚本中我有连接其他服务的功能。当我从服务中得到好的答案时,我遇到如何返回值或停止执行我的脚本的问题。函数process.exit(1)不起作用。

    function function1(item,response) {
var buf ='';
var net = require('net');
var HOST = 'xxxx.xxxx.xxxx.xxxx';
var PORT = xxx;

var client = new net.Socket();

client.setTimeout(100000, function() {
console.log("Timeout");
response.send(500, "Timeout");
});

client.connect(PORT, HOST, function() {
client.write(item + "\n");
client.on('data', function(data) {
buf = buf + data.toString('utf-8');
});

client.on('close', function() {
});

client.on('end', function() {
if (buf.length > 1) {
var result = JSON.parse(buf);
//if resulr.Aviable is true the functios should return result or send result and stop execiuting script
if ( result.Avaiable) {
response.send(200, result);
//now i wont't to respond answer to client or return my value(result)
console.log('Send data');
}
}
client.destroy();
});
});

}

最佳答案

一种替代方法是使用一个标志来指示是否已发送响应。这样,当达到第一个替代方案时,您可以将标志设置为 true(可能清除超时,以便它不会停留超过需要的时间),并在所有情况下在返回响应之前检查标志是否已设置。类似于下面的代码:

function function1(item,response) {
var buf = '';
var net = require('net');
var HOST = 'xxxx.xxxx.xxxx.xxxx';
var PORT = xxx;

var client = new net.Socket();

var responseSent = false;

var timeoutHandler = client.setTimeout(100000, function() {
if (!responseSent) {
responseSent = true;
console.log("Timeout");
response.send(500, { error: "Timeout" });
}
});

client.connect(PORT, HOST, function() {
client.write(item + "\n");
client.on('data', function(data) {
buf = buf + data.toString('utf-8');
});

client.on('close', function(had_error) {
if (!responseSent) {
clearTimeout(timeoutHandler);
responseSent = true;
console.log('Socket closed');
response.send(500, { error: had_error ? 'Socket error' : 'unknown' });
}
});

client.on('end', function() {
if (!responseSent) {
responseSent = true;
clearTimeout(timeoutHandler);
if (buf.length > 1) {
try {
var result = JSON.parse(buf);
if (result.Available) {
response.send(200, result);
} else {
response.send(500, { error: 'Socket data is not available' });
}
} catch (ex) {
response.send(500, { error: 'error parsing JSON', exception: ex });
}
} else {
// We should always return a response
response.send(500, { error: 'No data read from socket' });
}
}
client.destroy();
});
});
}

请注意,由于 node.js 在单线程上运行,因此您可以假设不会出现响应发送两次的情况。另外,您应该确保响应始终发送一次 - 在您的代码中,如果存在套接字错误,或者如果 buf.length 不大于 1,或者如果 result.Avaiable 不为 true,则将发送超时响应,但您不需要等待整个(100 秒)时间来发送该响应。

关于node.js - 返回值,或停止脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22247746/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com