【发布时间】: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