My code is working perfectly when I test it myself but failing the automated tests. I think it’s because the automated tests are calling the GET
request immediately after the POST
and my MongoDB hasn’t update yet. I’m lost as to how to make sure my code waits for the new Site
model to initialize before preforming the GET
'use strict';
var express = require('express');
var mongo = require('mongodb');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var cors = require('cors');
const dns = require('dns');
var app = express();
var port = process.env.PORT || 3000;
process.env.MONGO_URI="mongodb+srv:/<db_url>.mongodb.net/<dbname>?<db_pass>";
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true });
app.use(cors());
app.use(bodyParser.urlencoded({extended: false}))
app.use('/public', express.static(process.cwd() + '/public'));
app.get('/', function(req, res){
res.sendFile(process.cwd() + '/views/index.html');
});
const Schema = mongoose.Schema;
var siteSchema = new mongoose.Schema({
url : String,
url_id : Number
});
var Site = mongoose.model('Site', siteSchema)
app.post("/api/shorturl/new", function (req, res) {
var siteUrl = req.body.url
var replacedUrl;
const REPLACE_REGEX = /^https?:\/\//i;
if (REPLACE_REGEX.test(siteUrl)) {
var replacedUrl = siteUrl.replace(REPLACE_REGEX, '')
} else {
res.json({error: "invalid url"});
return;
}
dns.lookup(replacedUrl, (err,address) => {
err ?
res.json({error: "invalid url"}) :
Site.exists({url: siteUrl}, (err,result) => {
if (err) { console.log(err) }
if (result) {
Site.findOne({url: siteUrl}, (err,data)=> {
res.json({original_url: data.url, short_url: data.url_id});
console.log(`${data.url_id} - ${data.url} *** returned`)
});
} else {
Site.countDocuments({}, (err,data) => {
var site = new Site({url: siteUrl, url_id: (data+1)})
site.save();
res.json({original_url: site.url, short_url: site.url_id});
});
}
});
})
});
app.get("/api/shorturl/:route", function (req, res) {
var route = req.params.route;
console.log(route);
console.log(/^[0-9]*$/i.test(route));
/^[0-9]*$/i.test(route) ?
Site.findOne({url_id: route}, (err,result) => {
if (err) { console.log(error) }
result === undefined || !result ?
res.json({error: "No short URL found for the given input"}) :
res.redirect(result.url);
}) :
res.json({error: "Wrong format"});
})
app.listen(port, function () {
console.log('Node.js listening ...');
});
Browser information:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0
.
Challenge: URL Shortener Microservice