【问题标题】:How do I POST data into MongoDB database using node.JS?如何使用 node.JS 将数据发布到 MongoDB 数据库?
【发布时间】:2018-01-07 02:44:31
【问题描述】:

下面的代码很乱,所以不要过多判断!我正在尝试将基本用户配置文件发布到我的数据库中,我认为我离得不远,但我不断收到 404。

我对所有这些技术都很了解,所以有人可以告诉我我做错了什么。

node.js POST 方法

var express = require('express');
var router = express.Router();
var mongo = require('mongodb');
var assert = require('assert');
var url = 'mongodb://localhost:27017/local';

/* GET home page. */
router.get('/', function(req, res, next) {
    res.render('signIn', { title: 'signIn' });
});

router.get('/getData', function(req, res, next){
    mongo.connect(url, function (err, db) {

        assert.equal(null, error);
        var cursor = db.collection('userData').find();
        cursor.forEach(function(doc, err){
            assert.equal(null, err);
            resultArray.push(doc);
        }, function() {
            db.close();
            res.render('index', {items: resultArray});
        } );
    });
});

router.post ('/insert', function(req,res,next) {
    var item = {
        email: req.body.email,
        firstName: req.body.firstName,
        lastName: req.body.lastName,
        password: req.body.password
    };
    mongo.connect(url, function (err, db) {
        assert.equal(null, err);
        db.collection('userData').insertOne(item, function (err, result) {
            assert.equal(null, err);
            console.log('item has been inserted');
            db.close;
        });
    });

    res.redirect('/');
});
module.exports = router;

形成 HTML

<!DOCTYPE html>
<html lang="en">
<head>


    <title>SignIn Page</title>
    <link rel="stylesheet" type="text/css" href="/stylesheets/signIn.css"/>


</head>

<body>

<div class="background">


<div class="loginFormWrapper">
    <form action="/users/submit" method="POST">
        <div class="loginForm">
            <label for="firstName">First name:</label>
            <input type="text" class="form-control" id="firstName" name="firstName" placeholder="first name">

            <label for="lastName">Last name:</label>
            <input type="text" class="form-control" id="lastName" name="lastName" placeholder="last name">

            <label for="email">Email address:</label>
            <input type="email" class="form-control" name="email" id="email" placeholder="email">

        </div>
        <div class="form-group">
            <label for="pwd">Password:</label>
            <input type="password" class="form-control" name="password" id="password" placeholder="password">
        </div>
        <div class="checkbox">
            <label><input type="checkbox"> Remember me</label>
        </div>
        <button type="submit" class="btn btn-default">Submit</button>

    </form>
    <form action="users" method="GET">
        <button type="submit" class="btn btn-default">get result</button>
    </form>
</div>

</div>


</body>
</html>

App.js

    var express = require('express');

    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    var validate = require('form-validate');
    var mongoose = require('mongoose');




    var index = require('./routes/index');
    var users = require('./routes/users');
    var About = require('./routes/about');
    var signIn = require('./routes/signIn');
    var contact = require('./routes/contact');


    var app = express();




    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');

    // uncomment after placing your favicon in /public
    //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    app.use('/', index);
    app.use('/users', users);
    app.use('/About', About);
    app.use('/signIn', signIn);
    // app.use('/contact', contact);







//catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
 });

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

用户.js

var express = require('express');
var app = require("mongoose");
var router = express.Router();


/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;

【问题讨论】:

  • 你要什么网址?
  • 变量网址?这是 mongodb 的默认设置。在 post 和 get 方法中,我通过 url 连接到该数据库......我的代码是不同教程的合并,所以一些 var 名称可能很奇怪!
  • 我的意思是像 localhost:3000/users/something 这样的 URL。你说你得到 404 但你没有提到 URL 地址
  • 哦,对不起,这个>localhost:3000/users/submit
  • 发布你的 routes/users.js 文件

标签: html node.js mongodb forms post


【解决方案1】:

在你的app.post 函数中你应该有这样的东西:

let MongoClient = require('mongodb').MongoClient;
let connectionUrl = "mongodb://localhost:27017/";
// or
// let connectionUrl = "mongodb+srv://<username>:<password>@<your-cluster-url>/test?retryWrites=true&w=majority";

// creating the message object
let obj = {"text" : "Something"};

console.log("OBJ: " + obj);

MongoClient.connect(connectionUrl, function(err, client) {
    if (err) throw err;
    
    console.log("Connected correctly to server");

    // if database and collection do not exist they are created
    
    var db = client.db('YourDatabase')
    
    db.collection("YourCollection").insertOne(obj, function(err, res) {
        if (err) throw err;
        console.log("1 message inserted");
        client.close();
    });
});

【讨论】:

    【解决方案2】:

    快速提醒一下,post() 方法只是从您指定的&lt;form&gt; 中获取数据。为了能够获得这些数据,你必须做这样的事情。

    app.js

    const express = require('express)
    const mongoose = require('mongoose)
    
    var app = express()
    
    mongoose.connect('mongodb://localhost:"yourPortHere"/"mongoDBhere"')
    

    现在 post 需要 body 解析器,以便能够检索数据并将其“翻译”为 JS,因为您需要 body 解析器。

    app.use(bodyParser.urlencoded({extended: false})) //Post Body Parser
    

    现在让我们进入帖子

    app.post("/action", (req, res) => {
    var userData = {
        username: req.body.username,
        password: req.body.password
    }
    

    目前 userData 将保存您刚刚从 &lt;form&gt; 检索到的数据 请记住action="/YourActionHereapp.post("/YourActionHere") 的标识符,因此这两个必须匹配,否则您将无法获取数据。

    要将其保存到 MongoDB,您首先需要创建要存储的对象的模型,如果 MongoDB 有一个名为 movies 的数据库,其目录名为 films您首先必须创建一个名为 film 的模型,因为 mongoose 会将其保存在目录 films 中(

    所以:在文件夹 Models 中创建对象的模型

    const mongoose = require('mongoose')
    const Schema = mongoose.Schema
    var film = new Schema({
    title: String,
    year: String,
    director: String 
     })
    module.exports = mongoose.model("movie", movieSchema)
    

    为了能够使用该新架构,您必须将其导入您的 app.js 中

    var Film = require('pathToFilmSchema')
    

    现在在您的帖子中,您将 userData 保存到该 Schema,mongoose 会将其存储在其 .js 中指定的集合中。

    app.post("/action", (req, res) => {
     var userData = {
        title: req.body."name",
        year: req.body."name",
        director: req.body.""
    }
    new Film(userData)
    })
    

    如果结构相同,该变量中的数据将存储在Schema中,那么您只需调用方法.save(),您可以像这样立即调用该方法

    newFil(userData)
    .save()
    

    现在 mongoose 会将带有 film Schema 的新对象存储到您在顶部连接的数据库中。请记住,如果您没有名为 film 的集合,mongoDB 将创建一个名为 films 的集合(始终是复数)并将 Schema 存储在那里。

    保存后你可以res.redirect()到“/”或者渲染另一个页面,这取决于你。

    【讨论】:

      【解决方案3】:

      您已发布到 url users/submit,但我没有看到 users/submit 的任何 API。您说过要使用用户作为/users 网址,但您是否在/users 中定义了/submit

      你可以通过这个 Routing in expressjs

      【讨论】:

      • 我已经读过了,谢谢。我认为很明显我不太了解路由
      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2018-06-21
      • 2015-08-04
      • 1970-01-01
      • 2019-10-09
      相关资源
      最近更新 更多