我有一个Web客户端,它从用户那里获取参数,然后使用简单的HTML提交表单将表单提交给服务器。
服务器运行的脚本有时可能需要几分钟才能完成。
当脚本运行超过几分钟时,客户端将重新提交表单,而不是等待第一次提交完成。
如何防止这种情况发生?
示例代码:
提交表格:
<form action="/testCall">
<button type="submit" name="Button">Submit</button>
</form>
在服务器上调用命令:
app.get('/testCall', function(req,res){
var exec = require('child_process').exec;
var cmd = "myCommand";
exec(cmd, function callback(error, stdout, stderr){
res.render('newPage.html', {data: stdout});
});
});
在这种情况下,myCommand
将运行很长时间,客户端将尝试重新提交表单。
答案 0 :(得分:1)
这不是通常的处理方式,您没有提到的问题是,用户和后端代码之间的某个层有时可能表示超时。提交表单真的不需要花几分钟。
使用在服务器端使用的任何技术(显然是Node,但是我不知道如何在Node上完成),通常在服务器上启动异步任务然后立即返回给用户,向他显示不带表单的页面,而是显示该工作正在进行中的指示。
每隔一段时间,页面就会询问服务器任务是否已经完成,然后使用脚本的结果刷新自身,或者用户可以手动执行。
此外,此脚本由GET请求启动。请不要这样做,GET请求并不意味着要更改服务器上的任何内容。如果您改用POST,那么当用户盲目地使用F5重新提交它时,至少浏览器已经显示了警告(但用户也会无意识地忽略该警告)。
答案 1 :(得分:1)
尽管RemcoGerlich的建议确实很好,但我的问题是nodeJS阻止了运行时间过长(超过两分钟)的请求
要解决这个问题,您必须在nodeJS后端代码中禁用响应超时:
类似这样的东西:
public SQLiteInvoicedItems(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE);
onCreate(db);
}
花点时间找我,希望能对那里的人有所帮助!