首先把本地数据导出来,在本地到moba-mobile-site执行命令:mongodump -d 数据库名称:
-d 表示要导出哪个数据库,在db.js里面已经写过了,连接的是本地的27017/moba,所以moba就是我们的数据库名称。
所以执行命令:mongodump -d moba
但是这里会报错:mongodump: command not found
经查是因为安装mongodb时未配置环境变量,会出现如下图错误:不认识mongodump是什么指令。
参考这篇文章:https://blog.csdn.net/wangcuiling_123/article/details/78591084
配置环境变量:
还有记得重新启动mongoDB服务后,便可以在任意位置进行mongod命令了(查看版本), 再次运行mongodump -d moba 就在当前文件夹出现了一个dump文件夹了。
这个dump文件夹后面是不需要的,只是备份,暂时放这边。要把里面所有数据库中导出的文件放到服务器上去,然后在服务器上运行导入就可以了。
接下来去服务器上打开一个文件夹:在vscode里远程资源里,打开/root/ 个人文件夹,然后把刚刚那些数据库文件复制过来,复制dump文件夹,到root个人文件夹里,复制好后打开服务器中的终端,执行一个mongorestore,恢复数据。
所以这两个命令是成对的,在本地要导出数据的地方执行mongodump -d,导出哪个数据库,现在打开网页看一下:
如果服务器停了,需重启服务器:
先cd /data/moba-mobile-site/,然后执行:pm2 start moba-node/index.js
但是后台中的物品列表中图片有问题,但是英雄列表中的图片没有问题,因为英雄列表中的图片就是线上地址,而物品列表中图片是因为上传地址为localhost:3000,是个本地地址,如果这个网站要给别人用的话,在他们的本地肯定是没有开localhost:3000这个端口的,所以图片绝对不能出现本地地址。
由于这个地址已经传过了,已经晚了,现在改是修复以后会出现的问题,到moba-node/routes/admin/index里:
图片上传地址里面的localhost:3000:
改成线上地址:
file.url = http://test.miqilin21.cn/uploads/${file.filename}
当本地代码改了之后呢,就要同步到正式的服务器上去,这里先把dump临时的文件删了,不要加到版本库里。
git status看修改了什么,检查当前文件状态,git diff看一下这个文件是哪里修改的,按一下q就退出去。接下来就是把代码推到github上。
先执行:git commit -am "fix upload url",把本地代码库提交完成了,-am是add,modify的缩写。
上传到github上后到服务器上拉一下代码:在 /data/moba-mobile-site/里输入:(sudo) git pull
注意:每次拉完代码后,在服务器上由于我们并不是用nodemon来启动的,nodemon可以自动重启,但是pm2是正式的用的是node,不会重启,所以要用pm2 reload index,类似刷新。index是我们开启那个name,用pm2 list可以看那个id:
以后一定要记住:!!!!拉完代码一定要 pm2 reload 这个进程的一个名称,这个代码才会更新。
下一步是迁移数据,回到线上后台界面,可以看到这个图片还是没显示,检查一下:
还是本地的3000,我们要把这个数据改掉。
涉及到改数据,接下来就是要操作数据库,最好是有个可视化的s数据库的管理软件,建议下载 Robo 3T,打开它之后可以通过它连接到数据库上去,
创建一个连接,比较重要的是要选择这个SSH,因为我们从这里连接到服务器上去是不能直接去连的,一定要我们通过img/SSH登上服务器,再到服务器上去连接本地的数据库localhost:27017,
点左下角test测试一下,都是可以后就保存了。
然后连接服务器上的数据库,可以看到一个moba,就是这个数据库了:
collections:是这个数据库的集合;比如items就是对应的Item数据模型的所有数据。
里面的数据几乎就是我们JS里的json数据了,但有点区别,比如说_id是个对象,并不是一个普通的数字或文字。可以看到里面的物品还是3000地址:
我们要改的就是它。
可以在表格模式下一个个去修改,表格模式可以点右键Edit Document修改,但是这种方式比较繁琐,这里介绍一个技巧:通过mongodb里的命令行去修改它,比如双击某个集合,其实就是执行了右边这个命令,所以mongodb和nodejs结合是最好用的,因为都是js语言:
这里的命令行可以用JS的一些方法,比如forEach,map,都是JS的语法:
右键点击集合,open shell,输入以下代码:
db.getCollection("items").find({}).map(doc => {doc.icon = doc.icon ? doc.icon.replace('localhost:3000', 'test.miqilin21.cn') : nulldb.items.save() //记得这行return doc})
执行一下,就修改好了:
再回去后台界面:
物品也就有了,地址也是对应域名的地址了。
所以用Robo 3t来直接修改服务器上的数据库的信息是比较方便的,还有英雄司马懿里的技能和首页广告也没照片,一样去修改地址就可以了。
至此就完成了本地到线上数据库的迁移。
还有记得每次拉完代码,如果server有新的npm依赖,要进去server里**sudo npm i**一下,不然会报nginx 502错误
