这周摸索着网站的建设,终于在今天成功上线!这里要谢谢ghost中文网和群里的网友,他的博客在这opengiser。他们的帮助太重要了。现在把过程记录下来,共同学习。试运营地址在edwardesire。 现在放ACE上了
新建BAE工程在百度开发云平台的管理控制台下一次点击:开发者服务管理->创建工程->创建->应用引擎-添加部署-创建。这样nodejs的环境就建好了。这里一起把数据库也建立起来。这里我使用的是mysql,点击应用引擎中的扩展服务即可,添加新服务当然使用免费版的咯。
配置接下来就是在本地把源码配置好咯。将工程clone下来后,用ghost源码覆盖掉。在本地运行命令npm install,后将下载好的mysql覆盖掉node_modules下原有的。然后打开根目录的config.example.js将database段修改为如下:
PRoduction: { database: { client: 'mysql', connection: { host: 'sqld.duapp.com', port: 4050, user: '#####', //你的ak passWord: '#####', //你的sk database: '#####',//数据库名 charset: 'utf8' }, debug: false }, server: { host: '127.0.0.1', port: '18080' } }
最后再修改根目录的config.example.js。修改启动命令,将"start": "node index"改为"start": "node index.js"。并去掉依赖dependencies、optionalDependencies、devDependencies这三项。
图像存储问题在package.json中的dependencies添加七牛的依赖包,在config.example.js中production和添加:
qiniu: { bucketname: '#####', //七牛云的目录名 access_KEY: '#####', //七牛云的ak SECRET_KEY: '#####', //七牛云的sk root: '/image/', prefix: 'http://' //七牛的空间域名}
最后在core/server/storage做两个操作
覆盖index.js文件
var errors = require('../errors'),storage;var qiniuConfig = require('../config/').qiniu;function get_storage() { // TODO: this is where the check for storage apps should go // Local file system is the default var storageChoice = qiniuConfig? 'qiniu':'localfilesystem'; if (storage) { return storage; } try { // TODO: determine if storage has all the necessary methods storage = require('./' + storageChoice); } catch (e) { errors.logError(e); } return storage;}module.exports.get_storage = get_storage;
并添加一个qiniu.js文件
// # Local File System Image Storage module// The (default) module for storing images, using the local file systemvar _ = require('lodash'), express = require('express'), fs = require('fs-extra'), nodefn = require('when/node/function'), path = require('path'), when = require('when'), config = require('../config'), errors = require('../errors'), baseStore = require('./base'), crypto = require('crypto'), qiniu = require('qiniu'), qiniuConfig = config.qiniu, qiniuStore; qiniu.conf.ACCESS_KEY = qiniuConfig.ACCESS_KEY; qiniu.conf.SECRET_KEY = qiniuConfig.SECRET_KEY; qiniu.conf.USER_AGENT = 'Ghost 0.4.2'; var putPolicy = new qiniu.rs.PutPolicy(qiniuConfig.bucketname), uptoken = putPolicy.token(); qiniuStore = _.extend(baseStore, { // ### Save // Saves the image to storage (the file system) // - image is the express image object // - returns a promise which ultimately returns the full url to the uploaded image 'save': function (image) { var saved = when.defer(), md5sum = crypto.createHash('md5'), ext = path.extname(image.name), targetDirRoot = qiniuConfig.root, targetFilename, key, extra = new qiniu.io.PutExtra(); var savedpath = path.join(config.paths.imagesPath, image.name); nodefn.call(fs.copy, image.path, savedpath).then(function(){ return nodefn.call(fs.readFile, savedpath); }).then(function(data) { md5 = md5sum.update(data).digest('hex'); targetFilename = path.join(targetDirRoot, md5.replace(/^(/w{1})(/w{2})(/w+)$/, '$1/$2/$3')) + ext; targetFilename = targetFilename.replace(////g, '/'); key = targetFilename.replace(/^///, ''); return nodefn.call(qiniu.io.put, uptoken, key, data, extra); }).then(function () { return nodefn.call(fs.unlink, savedpath).then(function(){ return nodefn.call(fs.unlink, image.path); }).otherwise(errors.logError); }).then(function () { // prefix + targetFilename var fullUrl = qiniuConfig.prefix + targetFilename; return saved.resolve(fullUrl); }).otherwise(function (e) { errors.logError(e); return saved.reject(e); }); return saved.promise; }, 'exists': function (filename) { // fs.exists does not play nicely with nodefn because the callback doesn't have an error argument var done = when.defer(); fs.exists(filename, function (exists) { done.resolve(exists); }); return done.promise; }, // middleware for serving the files 'serve': function () { var ONE_HOUR_MS = 60 * 60 * 1000, ONE_YEAR_MS = 365 * 24 * ONE_HOUR_MS; // For some reason send divides the max age number by 1000 return express['static'](config.paths.imagesPath, {maxAge: ONE_YEAR_MS}); } }); module.exports = qiniuStore;
Next个人觉得需要文章分类、归档archive和评论区,接下来就是搞定他们了。
!参考学习
新闻热点
疑难解答