从响应中获取单独的JSON

我和我的团队正在开发一个聊天应用:一个Android客户端和一个Web客户端。
最近,我们偶然发现了一个阻塞问题。 这里是如何:

所以networking和Android客户端(我将它们称为“客户端”)与Node.js服务器进行通信。

我们实际上正在login/注册部分。 这是我们到目前为止的一个例子:

Android客户端

  • MainActivity.java

    Button loginButton = (Button) findViewById(R.id.loginButton); loginButton.setOnClickListener(new LoginListener()); private class LoginListener implements View.OnClickListener { @Override public void onClick(View v) { CustomAsyncTask manageSession = new CustomAsyncTask(); Map<String, String> params = new HashMap<>(); params.put("postURL", "/signin"); params.put("username", mUsername.getText().toString()); params.put("password", mPassword.getText().toString()); manageSession.execute(params); } } 

简而言之,这段代码的作用是向/ signin路由发送参数化的POST请求。

Web客户端

 <form ...>...</form> <script type="text/javascript"> $('button').click(function(){ $.post('/signin',{username : $('#username').val(),password :$('#password').val()}); }) </script> 

服务器端

 // signin post app.post('/signin', function (req, res) { connection.query('SELECT * FROM User WHERE ((username = "' + req.body.username + '" OR email = "' + req.body.username + '") AND password = "' + req.body.password + '")', function (err, rows) { if (err) throw err; // If the user entered a valid username or email, then check for the password if (rows.length > 0 && rows[0].password == rows[0].password) { res.render('index', { status: "SUCCESS", username: req.body.username }) } else { // Valid username or email, but invalid password res.render('index', { status: "FAILURE", username: req.body.username }) } }); }) 

问题

从上面的代码片断可以看到,客户端向/signin路由发送POST请求,但是:

  • Android客户端期望纯JSON作为响应
  • Web客户端期望整个页面作为响应(index.ejs)

res.render()解决了客户端2的问题, res.end({json})客户端1解决了这个问题。

有没有办法让我们分开回应,让每个客户得到它想要的?
解决这个问题的最佳方法是什么?

你可以添加一个额外的variables,如果它来自networking或Android,然后根据需要进行操作。 例如-

 app.post('/signin', function (req, res) { connection.query('SELECT * FROM User WHERE ((username = "' + req.body.username + '" OR email = "' + req.body.username + '") AND password = "' + req.body.password + '")', function (err, rows) { if (err) throw err; // If the user entered a valid username or email, then check for the password if (rows.length > 0 && rows[0].password == rows[0].password) { if(req.body.device_type == "web"){ res.render('index', { status: "SUCCESS", username: req.body.username }) } else{ res.end({ status: "SUCCESS", username: req.body.username }) } } else { // Valid username or email, but invalid password if(req.body.device_type == "web"){ res.render('index', { status: "FAILURE", username: req.body.username }) } else{ res.end({ status: "FAILURE", username: req.body.username }) } } }); }) 

和在android中: –

 params.put("postURL", "/signin"); params.put("username", mUsername.getText().toString()); params.put("password", mPassword.getText().toString()); params.put("device_type", "android"); manageSession.execute(params); 

在networking中: –

 $.post('/signin',{username : $('#username').val(),password :$('#password').val(),device_type:'web'}); 

让我知道如果有更多的问题。