Mongoose.create 创建文档但没有我的数据

Posted

技术标签:

【中文标题】Mongoose.create 创建文档但没有我的数据【英文标题】:Mongoose.create creating document but none of my data 【发布时间】:2017-01-04 08:33:27 【问题描述】:

我正在学习使用平均堆栈并尝试构建一个网址缩短器。我有一个模块,它接受 req.params.UserUrl 检查并确保它是一个有效的 url,然后创建一个我想用作短路径的随机数。我似乎找不到保存随机数的方法,以便我可以检查他们的下一个 url 请求。在谷歌搜索之后,似乎最有效的方法是使用 long_url 和 short_url:randomNumber 将对象保存在数据库中。我的代码没有抛出任何错误,但是当我检查我的 heroku 数据库时,它有一个新条目,但只有 mLabs 自己生成的 _id 和 __v。有人可以告诉我哪里出错了。

路由文件

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var URLShortener = require(process.cwd()+'/public/Modules/urlShortener.module.js');
var ShortURL = require('../models/shortUrl.js');

router.get('/', function(req, res) 
  res.render('index',  title: 'FreeCodeCamp Projects' );
);


router.get('/urlShortener', function(req, res)
  res.render('freecodecamp/urlShortener',  title: 'Url Shortener Site');
);

router.get('/urlShortener/:userUrl', function(req, res)
  if(URLShortener.checkValidUrl(req.params.userUrl))
     
      var UserUrl = req.params.userUrl;
      var randNbr = URLShortener.assignRanNbr();
      ShortURL.create(URLShortener.createUrlObj(UserUrl, randNbr), function (err, smallUrl) 
    if (err) return console.log(err);
    else res.json(smallUrl);
    );
   
else
   
     res.send('Invalid url');
   
);

router.get('/:short', function(req, res)
  if(randNbr == req.params.short)
    
      res.redirect(userUrl);
    
  else
    
      res.send('Not the correct shortcut');
    
 );

module.exports = router;

网址架构

var mongoose = require('mongoose')
var Schema = mongoose.Schema

var shortUrlSchema = new Schema(
  long_id:String,
  short_id:Number
, collection: 'shortUrl');

module.exports = mongoose.model('shortUrl', shortUrlSchema);

urlShortener 模块

'use strict'

module.exports.checkValidUrl = function(url)
var pattern = new RegExp(/((([A-Za-z]3,9:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/);
return pattern.test(url);


module.exports.assignRanNbr = function()
    var randNbr = Math.floor(Math.random() * (9999 - 1 + 1)) + 1;
    return randNbr;


module.exports.createUrlObj = function(url, num)
    var urlObj = ;
    urlObj.original_url = url;
    urlObj.short_url = 'https://rawlejuglal-me-rawlejuglal-1.c9users.io/freecodecamp/'+num;
    return urlObj;

【问题讨论】:

【参考方案1】:

您的 createUrlObj 方法返回一个具有属性original_urlshort_url 的对象,但您的shortUrlSchema 属性是long_idshort_id。 create 方法中的属性名称需要与您的架构匹配。属性值类型还必须与您的模式类型匹配(目前short_url 是一个字符串,short_id 是一个数字)。我认为你真正想要的是你的 createUrlObj 方法是

module.exports.createUrlObj = function(url, num)
    var urlObj = ;
    urlObj.long_url = url;
    urlObj.short_id = num;
    return urlObj;

你的架构是

var shortUrlSchema = new mongoose.Schema(
    long_url: String,
    short_id: Number
, collection: 'shortUrl');

此外,您的'/:short' 路由应该调用数据库,因为该路由中没有定义randNbruserUrl 变量。

router.get('/:short', function(req, res)
    ShortUrl.findOne(short_id: req.params.short, function(err, shortUrl)
        if(err) res.send('Invalid Url');
        res.redirect(shortUrl.long_url) 
    )
);

【讨论】:

嘿,我可以再问一个问题吗?一切都在处理 res.redirect。我的 app.js 文件有 app.use('/freeCodeCamp', freeCodeProjects);具有包含这些路线的正确要求。所以当我访问 '/:short' 时,它真的是 freecodecamp/:short。如何让它在没有 freecodecamp/(shortUrl.long_url) 的情况下重定向,因为现在控制台似乎将 freecodecamp/ 放在它前面 您需要传递一个完全限定的 url,其中包含“http://”。尝试做 res.redirect("http://" + shortUrl.long_url) 谢谢,就是这样。你是最棒的!

以上是关于Mongoose.create 创建文档但没有我的数据的主要内容,如果未能解决你的问题,请参考以下文章

mongoose .create 给 node.js “ValidationError:验证失败:转换为 [undefined] 值失败......”

我正在尝试使用 knownTravelerNumber 创建 SABRE SpecialServiceRQ,但文档没有帮助

为啥我创建 PDF 文档时没有应用我的字体?

我用dom4j创建了一个xml文档,没有错误,但运行没有结果,哪位高手指点一下

如何使用 grunt-ngdocs 创建 api 文档

动态创建的复选框不可点击