【问题标题】:Why cant I access my params using Express' Router() with 'GET' method为什么我不能使用带有 'GET' 方法的 Express'Router() 访问我的参数
【发布时间】:2016-08-31 18:23:37
【问题描述】:

我在 Angular 服务“PostSvc”上有一个重载的 fetch 函数 如果提供用户作为参数,则想法是仅返回该用户的帖子。否则从数据库中获取所有帖子....

用户是从 post.ctrl.js 传递的“对象”,具有以下键

{
    username: $scope.currentUser,
    body: $scope.postBody,
    user_id: $scope.currentUser._id
}

这给了我 _id 字段 mongodb/mongoose 按预期生成

console.log($scope.currentUser._id)

这是 Mongoose Post 模型:

var db = require('../db')

var Post = db.model('Post', {
    username : { type: String, required: true },
    body : { type: String, required: true },
    user_id: { type: String, required: true },
    date : { type: String, required: true, default: Date.now },
})

module.exports = Post

这是 server.js 文件中分配路由器的 sn-p:

app.use("/api/posts", require("./controllers/api/posts"))

这是 Express './controllers/api/post.js' 路由器:

var Post = require('../../models/post')

var router = require('express').Router()

var websockets = require('../../websockets')


// this route works just fine
// returns All posts from the db
//
router.get("/", function(req, res, next) {
    // find all posts from db
    //
    Post.find()
    .sort("-date")
    .exec(function(err, posts) {
        if (err) { return next(err) }
        res.json(posts)
        next()
    })
})

问题....

router.get("/:user_id", function(req, res, next) {
    var query = {}

    // these messages aren't being logged to console
    // so there's no way the route is being used
    console.log("from the get 'api/posts' method" )
    console.dir(req.params.user_id)

    if (req.params.user_id) {
        query = { user_id: req.params.user_id } // sent from posts.svc.js
    }
    // this query is not executing properly
    // I have no access to the `req.params.user_id`
    // 
    Post.find({ user_id: req.params.user_id })
    .sort("-date")
    .exec(function(err, posts) {
        if (err) { return next(err) }
        res.json(posts)
        next()
    })
})

router.post("/", function(req, res, next) {
    var post = new Post({ body: req.body.body })
    if (!req.auth) { return res.sendStatus(401) }
    post.username = req.auth.username
    post.user_id = req.body.user_id
    post.save(function(err, post) {
        if (err) { return next(err) }
        websockets.broadcast("new_post", post)
        res.status(201).json(post)
    })
})

module.exports = router

最后但同样重要的是,Angular 服务将初始“GET”请求发送到“server.js”->“./controllers/api/posts.js”并等待响应:

angular.module("app").service('PostsSvc', function($http) {
    this.fetch = function(user) {
        var credentials = {}
        if (user) {
            credentials = user

            // checkpoint
            //
            console.dir("from the fetch function " + credentials._id)
            // only return authencated users posts
            return $http.get("/api/posts", {
                params: {
                    user_id: credentials._id // to the posts.js router
                }
            })


            // return all posts otherwise
        } else { return $http.get("/api/posts") }


    }

    this.create = function(post) {
        return $http.post("/api/posts", post)
    }
})

【问题讨论】:

    标签: javascript angularjs node.js mongodb express


    【解决方案1】:

    router.get 在 express 中遇到了同样的麻烦。身体是空的。我终于转而使用router.post(),它对我来说非常有效,只要您还使用带有角度的发布请求调用 api。

    【讨论】:

    • 事实证明参数实际上是在请求的查询对象上
    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2021-11-29
    相关资源
    最近更新 更多