使NodeJSfunction同步? 在查询数据库之前发送json响应

我正在使用nodejs作为后端语言进行login/注册android应用程序UI。 发生什么事情是,每当我点击注册button,它发送json响应之前查询数据库(select语句来检查是否存在用户名)导致android应用程序得到错误的响应,导致我点击button两次注册正确响应。 例如,让我们说他们是一个名为testing在数据库中的用户名,我尝试使用用户名testing注册,它会告诉我,用户名已被采取,如果擦除testing,并input让说'BOB'不存在数据库它仍然说,用户名已被采取,即使它不是,但当我再次单击注册button它将注册用户。 我假设这是因为它是asynchronous(它发送json响应,而查询数据库之前或之前)。 我怎样才能使这个同步,或有另一种方法来解决这个问题?

服务器文件:

var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var mysql = require('mysql'); //connection var con = mysql.createConnection({ host: "localhost", user: "root", password: "password", database : "androidtest" }); //use json app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); //declare variables to hold values entered by the user var name; var username; var password; var age; //boolean array to let frontend know what is going on var response; app.post('/', function(req, res) { //retrieve variables username = req.body.username; name = req.body.name; age = req.body.age; password = req.body.password; //query database //check if username is taken var select = "SELECT * FROM users WHERE username = ? LIMIT 1"; con.query(select, [username], function (err, results) { if (err) throw err; //if username is taken send json string 'exists' to android app if(results.length) { response = {"exists" : "true"}; //if username is available send string 'success' and add the user to the database } else { var add = "INSERT INTO users (name, username, age, password) VALUES (?, ?, ?, ?)"; response = {"success" : "true"}; con.query(add, [name, username, age, password]); if (err) throw err; console.log('row inserted'); } }); //send json res.json(response); //prevents the functions from being executed more than once res.end('/'); }); //listen on port 3000 app.listen(3000); 

Android应用程序的Java:

 bRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final String name = etName.getText().toString(); final String username = etUserName.getText().toString(); final String password = etPassword.getText().toString(); final int age = Integer.parseInt(etAge.getText().toString()); Response.Listener<String> responseListener = new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonResponse = new JSONObject(response); //Boolean exists = jsonResponse.getBoolean("exists"); String exists = jsonResponse.getString("exists"); if (exists.matches("true")) { Toast toast = Toast.makeText(getApplicationContext(), "username already exists", Toast.LENGTH_SHORT); toast.show(); } } catch(Exception e) { e.printStackTrace(); } try { JSONObject jsonResponse = new JSONObject(response); //Boolean success = jsonResponse.getBoolean("success"); String success = jsonResponse.getString("success"); if (success.matches("true")) { Intent intent = new Intent(RegisterActivity.this, LoginActivity.class); RegisterActivity.this.startActivity(intent); } else { AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this); builder.setMessage("Register Failed") .setNegativeButton("Retry", null) .create() .show(); } } catch (JSONException e) { e.printStackTrace(); } } }; RegisterRequest registerRequest = new RegisterRequest(name, username, age, password, responseListener); RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this); queue.add(registerRequest); } }); 

}

你必须放

 res.json(...); res.end('/'); 

在下面一行的结束之后(在else块之后):

 console.log('row inserted'); 

那么当查询完成时它首先被执行。