###前提・実現したいこと
アマゾンのAPIを叩いて、
商品データをDBに格納するシステムを組んでおります。
いま実現したいのは、そのシステムの管理画面で、
DBにアクセスしてデータを取得してフォームを表示、
フォームでsubmitされたら
フォームのデータをPOSTで受け取ってDBに格納する処理です。
node+Express+mongodb、稼働サーバ環境はcentos、
開発環境はmac(elCapitan)です。
###発生している問題・エラーメッセージ
DBから正常な値が取得できないことがあり、困っております。
以下に処理内容を記載します。
router.getが初回アクセス時の処理です。
DBから値をとってきてて、index.ejsを描画する処理です。
(プロミスはあまり意味がない状態になっていると思いますが、いろいろ試行錯誤した跡なのでできればスルーしていただけると)
router.post('/'・・・がPOST時の処理です。
フォームから受け取った値をdb_updateで更新して、
res.redirectでページを再表示させるように組んでいますが、
doc.saveした後に
AmazonDB.where().sort({'_id':'asc'}).exec(function(err,docs){
で再度DBにアクセスしてindexを描画する形をとっています。
ただ、saveの処理が完了していないうちに読みに行ってしまっているからだと思いますが、サーバ環境によっては正常な値がかえってきません。
(macでは動くけど、centosではダメだったり)
ページをリロードすると正常な値で表示されます。
これをうまく回避するにはどうしたらよいでしょうか。
お知恵を拝借できれば幸いです。
###ソースコード
var express = require('express');
var router = express.Router();
var http = require('http');
var ejs = require('ejs');
var qs = require('querystring');
var server = http.createServer();
var Promise = require('bluebird');
const ITEM_MAX=40;
var mongoose = require('mongoose');
var AmazonSchema = new mongoose.Schema({
asin: String,
url: String,
title: String,
monitoring: String,
starttime: String
});
var url = 'mongodb://localhost/ama';
var db = mongoose.connect(url);
var AmazonDB=db.model('ama',AmazonSchema);
// 初回アクセスの処理
router.get('/', function(req, res, next) {
var get_DB = new Promise(function (resolve, reject) {
AmazonDB.where().sort({'_id':'asc'}).exec(function(err,docs){
if (err) {
reject(error);
} else {
resolve(docs);
}
});
});
get_DB.then (function (docs) {
res.render('index', { title: 'Express', json: docs });
});
});
// postの処理 ---- ★1
router.post('/', function(req, res, next) {
for (i=0; i<ITEM_MAX; i++){ eval('var id=req.body.id'+i+';'); eval('var asin=req.body.asin'+i+';'); eval('var url=req.body.url'+i+';'); eval('var title=req.body.title'+i+';'); eval('var monitoring=req.body.monitoring'+i+';'); eval('var starttime=req.body.starttime'+i+';'); // タイトル、asin、urlの中身が空だった時はskip if(asin==null || url==null || title==null) { continue; } db_update(id,asin,url,title,monitoring,starttime); } res.redirect('/');
});
function db_update(id,asin,url,title,monitoring,starttime) {
AmazonDB.findOne({
'_id':id
},function(err,doc){
if (err){
console.log(err);
}
doc.id=id;
doc.asin=asin;
doc.url=url;
doc.title=title;
doc.monitoring=monitoring;
doc.starttime=starttime;
doc.save(function(err) { if (err){ console.log(err); } }).then();
});
}
###補足情報(言語/FW/ツール等のバージョンなど)
環境はcentos7、node v0.10.36、Express4.13.1、mongodb@2.1.4
mongoose@4.3.7です。
回答1件
あなたの回答
tips
プレビュー