所以我尝试使用 Node.js 服务器将数据从 Java Andoid 应用程序插入到 Mongodb 数据库。但是我的 JSON 对象是空的(正如我所想的)并且读取值是“未定义”。我正在使用 mongodb Atlas。 插入工作正常,但插入的是“null”
这是 Node.js 代码:
const express = require('express')
const { MongoClient } = require("mongodb")
const dotenv = require("dotenv")
const bodyParser = require('body-parser');
dotenv.config()
const app = express()
const uri = process.env.ATLAS_URI || ""
const client = new MongoClient(uri)
let connectedCLient, db
async function connectToMDB(){
try{
connectedCLient = await client.connect()
console.log("Connected to MongoDb")
} catch(err) {
console.log(err)
} finally{
db = connectedCLient.db("myDatabase")
}
}
app.listen(3000, ()=>{
console.log("Listening on port 3000...")
})
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
connectToMDB();
async function insert(data) {
try {
const database = client.db("myDatabase");
const users = database.collection("users");
const doc = {
name: data,
}
const result = await users.insertOne(doc);
console.log(`A document was inserted with the _id: ${result.insertedId}`);
} finally {
}
}
app.get("/users", async (req, res) =>{
try{
let collection = await db.collection("users")
let users = await collection.find().toArray()
res.status(200).json(users)
} catch(err){
res.status(500).json({error: "Users cannot be return"})
}
})
//it's a function where i'm trying to insert data
app.post('/postdata', (req, res) => {
let data = req.body.data;
insert(data).catch(console.dir)
res.status(200).json({
message: "Data received successfully " + data
});
});
这是我的java代码:
import android.app.Activity;
import android.app.DownloadManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Date;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {
Button btnSubmit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSubmit = findViewById(R.id.submit);
final RequestQueue queue = Volley.newRequestQueue(this);
final String url = "http://10.0.2.2:3000/postdata";
queue.start();
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = "John";
HashMap<String, String> params = new HashMap<String, String>();
params.put("name", name.toString());
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
url,
new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Toast.makeText(MainActivity.this, response.getString("message"), Toast.LENGTH_SHORT).show();
} catch (JSONException err) {
err.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "error.getMessage()", Toast.LENGTH_SHORT).show();
}
});
queue.add(jsonObjectRequest);
}
});
}
}
如果有人还有其他更简单、更好或更合适的方法,我将非常感激。
谢谢
诗。我是编程初学者,所以请友善:)
在您的代码中,Java 代码中使用的密钥与 Node.js 代码中预期的密钥之间存在细微的不匹配。要对齐它们,请进行以下更改:
Node.js code
app.post('/postdata', (req, res) => {
let data = req.body.name; // update to use "name"
insert(data).catch(console.dir)
res.status(200).json({
message: "Data received successfully " + data
});
});
还有
Java Code
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = "John";
HashMap<String, String> params = new HashMap<String, String>();
params.put("name", name); // use "name" instead of "data"
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
url,
new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Toast.makeText(MainActivity.this, response.getString("message"), Toast.LENGTH_SHORT).show();
} catch (JSONException err) {
err.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "error.getMessage()", Toast.LENGTH_SHORT).show();
}
});
queue.add(jsonObjectRequest);
}
});
这些调整应确保用于从 Android 发送数据的密钥与 Node.js 中预期的密钥一致,解决 Node.js 中接收“未定义”数据的问题。