设为首页 收藏本站
查看: 1760|回复: 0

[经验分享] 部署nodejs mongodb到cloud foundry

[复制链接]

尚未签到

发表于 2018-10-27 11:08:02 | 显示全部楼层 |阅读模式
  接上一个连接,登录成功之后,切换目录 push app 到cloud
  参照官网http://docs.cloudfoundry.com/docs/using/deploying-apps/javascript/#start,但是push总是失败,原因就是没有初始化manifest.yml文件。
  第一次创建的过程中,会问你是否save setting,如果自己app中没有此文件的话,一定要输入y。要么你就手动给app 添加此文件。如下图:
  cf push 如下图:
DSC0000.jpg

  push了两天都没push上去,突然看到这个界面还是很欣喜的!!
  不过最后,还是没有成功,如下图:
DSC0001.jpg

  于是查看log,主要的问题点如下:
DSC0002.jpg

  可以看出是连接db的时候报错了,应该是url路径问题。找到原因了,是启动时连接数据库报错。还是很欣慰的,应该是部署成功了,运行报错!!
  喝口水,再继续。。
  终于解决了,要命啊!
  push 了三天,终于解决问题了。原因有二。1.官网的api不是最新的,服务升级到V2了,但是api没有升级,不知道为什么。2.毕竟是初学,所以像数据库连接等方法,没有来得及研究源码,不知道怎样灵活应对。
  好了先看官网,http://docs.cloudfoundry.com/docs/using/services/node-service-bindings.html。
  先要创建一个服务:
$ cf create-service  然后,修改package.json,添加cf的依赖
"cf-autoconfig":"*"  然后,在需要数据库连接的地方,加上cf的引用
require("cf-autoconfig");  修改监听端口:
app.listen(process.env.VCAP_APP_PORT||3000);  连接数据库服务:
var record_visit = function(req, res){  require('mongodb').connect('', function(err, conn){
  conn.collection('ips', function(err, coll){
  object_to_insert = { 'ip': req.connection.remoteAddress, 'ts': new Date() };
  coll.insert( object_to_insert, {safe:true}, function(err){
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write(JSON.stringify(object_to_insert));
  res.end('\n');
  });
  });
  });
  
}
  按照官网的做法下来,还是会出现上述异常的!!!
  官方的API都不对,那才折磨人呢!!幸亏,只是玩儿,慢慢搞吧。
  看看官方的解释:http://support.cloudfoundry.com/entries/24374128-Mongodb-Migration-URL-must-be-in-the-format-mongodb-user-pass-host-port-dbname
  Hi, apologies for this, we are currently working on bringing the documentation up to date. It's clear that the cf-autoconfig module is not working as it should.
  看到这句话,不知道同学们有何感想~
  其实这里已经解释的很清楚了,我再说说我解决的过程
  1. 首先声明,require('mongodb').open、close的数据库连接方式,cf是不支持的,并且官方已经不支持了,参照https://github.com/mongodb/node-mongodb-native
  2.数据库连接的推荐方式:
MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {  if(err) throw err;
  var collection = db.collection('test_insert');
  collection.insert({a:2}, function(err, docs) {
  collection.count(function(err, count) {
  console.log(format("count = %s", count));
  });
  // Locate all the entries using find
  collection.find().toArray(function(err, results) {
  console.dir(results);
  // Let's close the db
  db.close();
  });
  });
  })
  3. cf中mongodb服务的url:
var svcs = JSON.parse(process.env.VCAP_SERVICES);  
var mongourl = svcs['mongolab-n/a'][0].credentials.uri;
  4. 所以,我们用127.0.0.1/db是不能连接数据库的,这也是报错的原因。所以把把URL改为
if(process.env.VCAP_SERVICES){  //app is running in the cloud
  var svcs = JSON.parse(process.env.VCAP_SERVICES);
  mongourl = svcs['mongolab-n/a'][0].credentials.uri;
  
}else{
  //running locally or not on cloud foundry
  mongourl = "mongodb://" + obj.hostname + ":" + obj.port + "/" + obj.db;
  
}
  5.修改所有的数据库连接,如下面形式
var record_visit = function(req, res){  require('mongodb').connect(mongoURL, function(err, conn){
  conn.collection('ips', function(err, coll){
  object_to_insert = { 'ip': req.connection.remoteAddress, 'ts': new Date() };
  coll.insert( object_to_insert, {safe:true}, function(err){
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write(JSON.stringify(object_to_insert));
  res.end('\n');
  });
  });
  });
  
}
  6. 创建一个单独的service
cf create-service  7. 绑定服务到app
cf bind-service --app appName --service serviceName  8. cf push 终于见到素未谋面的提示文字了
Push successful! App '****' available at http://****.cfapps.io  9. 访问一切正常。
  10. 另:有的同学,可能还是报数据库连接错误,有可能是session存储的配置方式不对,应该如下:
app.use(express.session({  secret: settings.cookieSecret,
  key: settings.db,
  cookie: {maxAge: 1000 * 60 * 60 * 24 * 30},//30 days
  store: new MongoStore({
  url: mongourl
  })
  
}));
  配置URL,不要配置db,具体参见http://kcbanner.github.io/connect-mongo/



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627061-1-1.html 上篇帖子: mongodb morphia 下篇帖子: MongoDB修改oplog size-cclo的博客
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表