Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Node.js ºÍ MongoDB ¹¹½¨Ò»¸ö¼òµ¥µÄ֪ͨ·þÎñ
 
×÷ÕߣºKevin Williams À´Ô´£ºIBM ·¢²¼ÓÚ£º2015-7-6
  2435  次浏览      28
 

ÄúÊÇ·ñÔøÊÔͼЭµ÷Ò»×é²»¶ÏÔö¼ÓµÄ¸÷ÖÖ¹¤¾ßµÄÐÐΪ£¬ÒԱ㴴½¨Ò»Ð©½Ï´óµÄϵͳ£¿¾ÍÎÒ¶øÑÔ£¬ÎÒÃǵĿª·¢ÍŶÓÐèÒª×é×°Ò»¸ö³ÖÐø½»¸¶¹ÜµÀ£¬²¢¶ÔÆä²Ù×÷½øÐÐÅÅÐò¡£ÊµÏִ˲Ù×÷µÄÒ»¸öÑ¡ÔñÊÇʹÓÃÒ»¸öÖ§³Ö´´½¨¡¢±ê¼ÇºÍ¶©ÔÄʼþµÄ֪ͨ·þÎñ¡£

¿ÉÒÔ½«ÕâÖÖ·þÎñÓ¦ÓÃÓÚ¹¹½¨ÏµÍ³£¬Ðû²¼Ð°汾µÄ¿ÉÓÃÐÔ¡£È»ºó£¬¹ÜµÀµÄÏÂÓÎ×é¼þ²Å¿ÉÒÔ½ÓÊÕ֪ͨ£¬²¢¸ù¾Ýа汾µÄ³öÏÖÀ´²ÉÈ¡Ðж¯¡£Ðж¯¿ÉÄܰüÀ¨Ö÷¶¯ÅäÖÃеIJâÊÔϵͳºÍÔËÐлعé²âÊÔÌ×¼þ¡£

¡°Í¨Öª·þÎñ²¢²»ÊDZØÐë°üº¬ÁîÈËÐ˷ܵÄÏûÏ¢²ÅÊÇÓÐÓõÄ֪ͨ·þÎñ¡£¡±

ÎÒ¿ª·¢ÁËÒ»¸ö¼òµ¥µÄ֪ͨ·þÎñ£¬Ê¹Óà Node.js ÔËÐÐʱ×÷Ϊ¶ÔʹÓà RESTful API ¿ìËÙ¿ª·¢ HTTP ·þÎñÆ÷µÄʵÏÖ¡£ÎÒ»¹Ñ¡ÔñÁËʹÓà MongoDB ×÷Ϊºó¶Ë¡£ÆäÃæÏòÎĵµµÄÌØÐÔ¶ÔÓÚ¿ìËÙ¿ª·¢Ô­ÐÍËÆºõÊÇÍêÃÀµÄ£¬ÎÒ²»±ØÌṩ¶Ô ACID£¨Ô­×ÓÐÔ¡¢Ò»ÖÂÐÔ¡¢¸ôÀëÐԺͳ־ÃÐÔ£©ÊôÐÔµÄÑϸñÖ§³Ö¡£

ÒªÁ˽âÈçºÎʵ¼Ê´´½¨Í¨Öª·þÎñ£¬Çëµ¥»÷ Run the app À´¼ìË÷ÓÉ֪ͨ·þÎñ´¦ÀíµÄ×î½üÎå¸öʼþÐźŵÄÈÕÖ¾¡£Äú¿´µ½µÄ´ó¶àÊýÐźŶ¼ÊÇÓÉÎÒÃǵIJúÆ·¹¹½¨ÏµÍ³Éú³ÉµÄ£¬¶øÇÒ¶¼ÊÇ JSON ¸ñʽµÄ¡£

¹¹½¨ÀàËÆÓ¦ÓóÌÐòµÄÒªÇó

¶Ô Node.js ºÍ Node.js ¿ª·¢»·¾³Óлù±¾µÄÁ˽â

ÓµÓÐÒÔÏÂÕâЩ Node.js Ä£¿é£ºExpress¡¢Underscore¡¢Nodemailer

ÓÃÓÚ×Ô¶¯»¯²âÊÔµÄÆäËûÄ£¿é£ºMocha¡¢Should¡¢Supertest

Ò»¸ö MongoDB NoSQL Êý¾Ý¿â

ÔĶÁ£ºNode.js ³¬Ô½»ù´¡

°²×°ÁË Node ºÍ MongoDB Ö®ºó£¬Äú¾Í¿ÉÒÔʹÓà Node µÄ°ü¹ÜÀíÆ÷£¨npm£©À´¼ÓÔØËùÐèµÄÒÀÀµ¹ØÏµ¡£Çë²Î¼û´Ó DevOps Services ÏÂÔØµÄ´úÂëÖÐµÄ package.json Îļþ£¬Á˽âÖ§³ÖÕâ¸öÓ¦ÓóÌÐòµÄÄ£¿éºÍ¿ò¼ÜµÄ¾ßÌå°æ±¾¡£

ÈÃÎÒÃÇ¿ªÊ¼°É£¡

²½Öè 1. ´´½¨ API

¸Ã API Óë REST ÀàËÆ£¬×ÊÔ´µÄ·ÃÎʺÍÐ޸ͼÊÇͨ¹ýʹÓÃΩһ URL À´Íê³ÉµÄ£¬ÕâЩ URL Ó¦ÓÃÁËÒÔÏ HTTP ¶¯´Ê£ºGET¡¢PUT¡¢POST ºÍ DELETE¡£Ê¹Óà HTTP ÏûÏ¢¹¦ÄܵÄÈκÎÓ¦ÓóÌÐò¶¼¿ÉÒÔ·ÃÎʸ÷þÎñ¡£ÕâÖÖ·½·¨Îª½«À´µÄ»ùÓÚä¯ÀÀÆ÷µÄ¹¤¾ßÌṩÁËÒ»¸ö¸É¾»µÄ½çÃæ¡£

Óɸ÷þÎñ¹ÜÀíµÄÖ÷Òª×ÊÔ´ÊÇʼþºÍ¶©ÔÄ¡£Ò»¸ö API ¿ÉÓÃÓÚÿ¸ö´´½¨¡¢¶ÁÈ¡¡¢¸üкÍɾ³ý²Ù×÷¡£

ÎÒ»ùÓÚ Express ¿ò¼ÜÀ´¹¹½¨´Ë API£¬ÒòΪ¸Ã¿ò¼Ü°üº¬Ò»¸öÇ¿´óµÄ Web Ó¦ÓóÌÐò¿ª·¢ÌØÐÔ¼¯£¬¶øÇÒÖ»ÐèÒª×ñÑ­¹ßÀý£¬¾ÍÄܷdz£ÇáËɵØÊ¹ÓÃËü¡£ÎÒÃÇÀ´¿´Ò»¿´Ó¦ÓóÌÐòµÄÖ÷ server.js Ä£¿éÖеÄÒÔÏ´úÂ룬¸ÃÓ¦ÓóÌÐòÓÃÓÚÉèÖö¨Ïòµ½ÕâЩʼþµÄ´«ÈëÇëÇóµÄ·ÓÉ£º

console.log ('registering event routes with express');
app.get('/events', event.findAll);
app.get('/events/:id', event.findById);
app.post('/events', event.addEvent);
app.put('/events/:id', event.updateEvent);
app.delete('/events/:id', event.deleteEvent);

È»ºó£¬¿ÉÒÔΪ¶©ÔÄÖØ¸´ÏàͬµÄ»ù±¾Ä£Ê½£º

console.log ('registering subscription routes with express');
app.get('/subscriptions', sub.findAll);
app.get('/subscriptions/:id', sub.findById);
app.post('/subscriptions', sub.addSubscription);
app.put('/subscriptions/:id', sub.updateSubscription);
app.delete('/subscriptions/:id', sub.deleteSubscription);

³ýÁËÕë¶ÔʼþºÍ¶©ÔĵÄÕâЩ»ù±¾²Ù×÷Ö®Í⣬»¹ÓÐÁíÍâÁ½¸öÖØÒªµÄ API£¬¾ßÌåΪ£º

Ò»¸öÓÃÓÚ±ê¼ÇʼþµÄ API£º

app.post('/signals', signal.processSignal);

Ò»¸öÓÃÓÚ¼ìË÷×î½üµÄÐźÅÈÕÖ¾µÄ API£º

app.get('/signallog', signallog.findRecent);

²½Öè 2. ʹÓúó¶Ë

MongoDB ÌṩÁË·þÎñµÄ³Ö¾Ã´æ´¢¡£ÎÒÖ±½ÓʹÓúó¶ËÎĵµ£¨¼¯ºÏ£©£¬¶ø²»ÊÇʹÓÃÒ»¸ö¶ÔÏóÓ³ÉäÆ÷¡£Node.js Ô­ÉúÇý¶¯³ÌÐòÌṩÁËËùÐèµÄÈ«²¿¹¦ÄÜ¡£

Á½¸öÖ÷ÒªµÄ×ÊÔ´£¨Ê¼þºÍ¶©ÔÄ£©±»Ö±½ÓÓ³Éäµ½Êý¾Ý¿â¼¯ºÏ¡£Óû§¿ÉÒÔÖ±½Ó·ÃÎÊËüÃÇ¡£ÀýÈ磬ÏñÇ°ÃæµÄ´úÂë¶Î¶¨ÒåµÄÄÇÑù£¬¶Ôʼþ×ÊÔ´µÄ GET ÇëÇó»á²úÉú¶Ô event.findAll µÄµ÷Óá£findAll º¯ÊýÊÇÔÚ events.js Ä£¿éÖж¨ÒåµÄ£º

exports.findAll = function(req, res) {
mongo.Db.connect(mongoUri, function (err, db) {
db.collection('events', function(er, collection) {
collection.find().toArray(function(err, items) {
res.send(items);
db.close();
});
});
});
}

findAll º¯Êý¼òµ¥µØÁ¬½Óµ½Êý¾Ý¿â£¬»ñµÃʼþ¼¯ºÏµÄÒ»¸ö¾ä±ú£¬²¢·µ»ØËùÓÐÔªËØ£¬È»ºó¹Ø±ÕÁ¬½Ó¡£ËùÓÐ API ÇëÇó¶¼ÒÔÕâÖÖÀàËÆµÄ·Ç³£Ö±½ÓµÄ·½Ê½½øÐд¦Àí¡£ÔÚÏÂÃæµÄʾÀýÖУ¬É¾³ýʼþÇëÇóÓÉ events.js Ä£¿éÖÐµÄ deleteEvent º¯Êý´¦Àí£º

exports.deleteEvent = function(req, res) {
var id = req.params.id;
mongo.Db.connect(mongoUri, function (err, db) {
db.collection('events', function(err, collection) {
collection.remove({'_id':new BSON.ObjectID(id)}, {safe:true}, function(err,
result) {
res.send(req.body);
db.close();
});
});
});
}

ºÍÇ°ÃæÒ»Ñù£¬½¨Á¢Ò»¸öÁ¬½Ó£¬²¢»ñµÃij¸ö¼¯ºÏµÄ¾ä±ú¡£È»ºó£¬¸ù¾ÝËùÌṩµÄ ID À´É¾³ý¼¯ºÏÔªËØ£¬²¢¹Ø±ÕÁ¬½Ó¡£

²½Öè 3. ·¢ËÍ֪ͨ

³ýÁ˶ÔÍйÜ×ÊÔ´Ö´Ðд´½¨¡¢Ìæ»»¡¢¸üкÍɾ³ý²Ù×÷Ö®Í⣬ÔÚ±ê¼Çʼþʱ£¬¸Ã·þÎñ»¹»á½«ÏûÏ¢·¢Ë͸øÊʵ±µÄ¶©ÔĶ˵㡣¸Ã·þÎñµÄµÚÒ»¸ö°æ±¾ÌṩÁ˵ç×ÓÓʼþ֪ͨ¡£½ÓÏÂÀ´µÄ¼¸¸ö´úÂë¶Î½«¸ú×ٶ˵½¶ËµÄÕû¸ö¹ý³Ì¡£

¿ÉÒÔͨ¹ýÐźÅ·ÓÉÀ´½ÓÊÕÐźš£Äú¿ÉÒÔ´Ó server.js Ä£¿é²é¿´¸ÃÐźţ¬ÎÒÃÇʹÓà signals Ä£¿éÖÐµÄ processSignal º¯ÊýÀ´´¦Àí´Ë·ÓÉ£º

app.post('/signals', signal.processSignal);

exports.processSignal = function(req, res) {
var signal = req.body;
console.log('Processing Signal: ' + JSON.stringify(signal)); mongo.Db.connect(mongoUri, function (err, db) {
db.collection('subscriptions', function(err, collection) {
collection.find().toArray(function(err, items) {
matches = _.filter(items, function(sub){return sub.eventTitle == signal.eventTitle});
_.each(matches, function (sub) {processMatch(sub, signal)});
res.send(matches);
});
});
});

ºÍÒÔǰһÑù£¬½¨Á¢Ò»¸öÊý¾Ý¿âÁ¬½Ó£¬²¢»ñµÃÏà¹Ø¼¯ºÏµÄÒ»¸ö¾ä±ú¡£È»ºó£¬ÎÒÃÇͨ¹ýɸѡÀ´»ñµÃÓë Event ±êÌâÆ¥ÅäµÄËùÓж©ÔÄ¡£Ëæºó£¬Í¨¹ý processMatch º¯ÊýÀ´´¦Àí´ËÆ¥Åä¶©ÔÄ×Ó¼¯µÄÿ¸öÔªËØ¡£

ÄúÊÇ·ñ×¢Òâµ½ÎÒʹÓÃÁË _.filter ºÍ _.each£¿ÕâЩ¶¼À´×ÔÒ»¸öÃûΪ Underscore µÄ·Ç³£¿áµÄ¿â£¬¸Ã¿âÌṩÁËһЩÇÉÃîµÄ¸¨Öúº¯Êý£¬Ê¹ÓùýÃæÏò¶ÔÏóµÄÓïÑÔ£¨±ÈÈç Ruby£©µÄ??Óû§Ó¦¸Ã¶Ô´Ë·Ç³£ÊìϤ¡£

processMatch º¯Êý¼òµ¥µØÎªµç×ÓÓʼþÏûÏ¢·ÖÅäÁËÊʵ±µÄÖµ£¬²¢µ÷ÓÃÁË mailer.sendMail º¯Êý£º

function processMatch(subscription, signal) {
opts = {
from: 'Simple Notification Service',
to: subscription.alertEndpoint,
subject: subscription.eventTitle + ' happened at: ' + new Date(),
body: signal.instancedata
}
// Send alert
mailer.sendMail(opts);
}

sendMail º¯ÊýÒ²·Ç³£Ö±¹Û£¬ÒòΪÎÒʹÓÃÁËÃûΪ NodeMailer µÄÁíÒ»¸ö¿â¡£Äú¿ÉÒÔ¿´µ½£¬ÎÒµÄ sendMail º¯ÊýֻʹÓÃÁËһЩ NodeMailer ¹¦ÄÜÀ´·¢Ë͵ç×ÓÓʼþ֪ͨ¡£´Ó¸ù±¾ÉϽ²£¬ËüʹÓÃÁËһЩÉí·ÝÑéÖ¤ÖµÀ´³õʼ»¯´«Êä¶ÔÏó£¬È»ºóÖ¸¶¨ÏûÏ¢ÄÚÈÝ£¨Ö÷Ìâ¡¢ÕýÎÄ¡¢µØÖ·µÈ£©£¬²¢¿ªÊ¼·¢ËÍ£º

exports.sendMail = function (opts) {
var mailOpts, smtpTransport;

console.log ('Creating Transport');

smtpTransport = nodemailer.createTransport('SMTP', {
service: 'Gmail',
auth: {
user: config.email,
pass: config.password
}
});

// mailing options
mailOpts = {
from: opts.from,
replyTo: opts.from,
to: opts.to,
subject: opts.subject,
html: opts.body
};

console.log('mailOpts: ', mailOpts);

console.log('Sending Mail');
// Send mail
smtpTransport.sendMail(mailOpts, function (error, response) {
if (error) {
console.log(error);
}else {
console.log('Message sent: ' + response.message);
}
console.log('Closing Transport');
smtpTransport.close();
});

}

²½Öè 4. ²âÊÔÓ¦ÓóÌÐò

ÎÒÒѾ­½éÉÜÁË֪ͨ·þÎñµÄÖ÷Òª¹¦ÄÜ¡£½ÓÏÂÀ´£¬ÎÒ½«¿ìËÙ½éÉÜ×Ô¶¯»¯²âÊÔ¡£

Node.js Éú̬ϵͳÖеÄÁíÒ»¸öÇÉÃîµÄ¿ò¼ÜÊÇÓÃÓÚ²âÊ﵀ Mocha¡£½áºÏʹÓà Mocha Ó븽¼ÓÏ±ÈÈç supertest ÓÃÓÚ HTTP£¬should ÓÃÓÚ¶ÏÑÔ£©£¬Îª API Ìṩ¿É¶ÁµÄ¹¦ÄܲâÊÔ¡£ÒÔÏÂÊÇÀ´×Ô eventtests.js Ä£¿éµÄƬ¶Î£¬ÓÃÓÚÑéÖ¤ readbyid Event API£º

it('should verify revised News flash 6 event', function(done) {
request(url)
.get('/events/'+ newsFlash6id)
.end(function(err, res) {
if (err) {
throw err;
}
res.should.have.status(200);
res.body.should.have.property('title');
res.body.title.should.equal('News flash 6 - revised');
done();
});
});

ÕâÖÖÓï·¨ºÍ¸ñʽ¾ßÓзdz£ºÃµÄ¿É¶ÁÐÔ£¬ÎÒÏ£ÍûËü»á±È½ÏÈÝÒ×ά»¤¡£

ÎÒµÄ×Ô¶¯»¯¹¦Äܻعé²âÊÔÌ×¼þ°üÀ¨Ã¿¸ö API µÄ²âÊÔ£¬ÎÒÒѾ­½¨Á¢ÁËÒ»¸ö²âÊÔÎļþ¼Ð£¬ÆäÖаüÀ¨ËùÓвâÊÔ¡£Mocha ³ÐÈÏÕâÒ»¹ßÀý¡£ÒªÔËÐвâÊÔÌ×¼þ£¬¿É´ÓÏîÄ¿µÄ¸ù·¢³öÃüÁî mocha¡£

ÈçÏÂͼËùʾ£¬Èç¹ûûÓÐʧ°Ü£¬²âÊÔÌ×¼þµÄÊä³öÓ¦¸Ã·Ç³£¼ò½à£º

ÎÒĿǰҪ×öµÄÊÇÔÚ±¾µØÔËÐд˻عé²âÊÔÌ×¼þ£¬£¨Í¨³££©ÔÚÎÒ×öÁËÐÞ¸Äʱ»áÖ´Ðд˲Ù×÷¡£ÎÒ×ÜÊÇÔÚÍÆËͱä¸ü֮ǰÔËÐÐËü£¬ÒÔʵÏÖÔ´´úÂë¿ØÖÆ¡£¸Ã·þÎñµÄÆäÖÐÒ»¸öʵÀýÔÚ Bluemix ƽ̨ÉÏÔËÐУ¬ Èç¹ûÄúµ¥»÷ÁË Run the app£¬¾ÍÒѾ­Óë´ËʵÀý½øÐÐÁË»¥¶¯£¬¶øÇÒÄú»¹»á¿´µ½Ò»¸ö×î½üµÄʼþÐźŵÄÈÕÖ¾¡£

Ŀǰ£¬ÎÒʵ¼ÊÉÏÓÐÁ½¸ö»·¾³£ºÒ»¸öÊÇÎҵı¾µØ¿ª·¢ÏµÍ³£¬ÎÒÔÚÉÏÃæ½øÐÐÐ޸IJ¢Ö´ÐвâÊÔ£¬ÁíÒ»¸ö»·¾³ÊÇ Bluemix ÉϵÄÉú²úϵͳ¡£ÕâÑùµÄ°²ÅÅĿǰÔË×÷Á¼ºÃ£¬µ«ÎÒµÄÏÂÒ»¸ö²½ÖèÊÇÔÚ BlueMix ÉÏ´´½¨ÁíÒ»¸öÍйܵÄÁÙʱ»·¾³¡£ÐµÄÁÙʱ»·¾³ÈÃÎÒ¿ÉÒÔÔÚ¸ü½Ó½üÉú²úµÄ»·¾³ÖÐÔËÐлعéÌ×¼þ£¬²¢ÔÚÐÞ¸ÄÔ´´úÂëºó£¬ÔÚÉú²ú»·¾³ÖпªÆô×Ô¶¯²âÊԺͲ¿ÊðµÈÑ¡Ïî¡£µ±ÎÒÂõ³öÕâÒ»²½Ê±£¬ÎÒÒ»¶¨»áÔÚ²©¿ÍÉϼǼÕâÒ»ÇС£

¿¼Âǹ¹½¨Ò»¸öÀàËÆµÄ¡¢¼òµ¥µÄ֪ͨ·þÎñ£¬ÓôóÁ¿µÄ¹¤¾ßÀ´¹ÜÀíʼþ¡£³¢ÊÔһϣ¬²¢ÈÃÎÒÃÇÖªµÀÄúµÄ³¢ÊÔ½á¹û£¡

   
2435 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

MySQLË÷Òý±³ºóµÄÊý¾Ý½á¹¹
MySQLÐÔÄܵ÷ÓÅÓë¼Ü¹¹Éè¼Æ
SQL ServerÊý¾Ý¿â±¸·ÝÓë»Ö¸´
ÈÃÊý¾Ý¿â·ÉÆðÀ´ 10´óDB2ÓÅ»¯
oracleµÄÁÙʱ±í¿Õ¼äдÂú´ÅÅÌ
Êý¾Ý¿âµÄ¿çƽ̨Éè¼Æ

²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿â
¸ß¼¶Êý¾Ý¿â¼Ü¹¹Éè¼ÆÊ¦
HadoopÔ­ÀíÓëʵ¼ù
Oracle Êý¾Ý²Ö¿â
Êý¾Ý²Ö¿âºÍÊý¾ÝÍÚ¾ò
OracleÊý¾Ý¿â¿ª·¢Óë¹ÜÀí

GE Çø¿éÁ´¼¼ÊõÓëʵÏÖÅàѵ
º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Nodejs¸ß¼¶Ó¦Óÿª·¢
ÖÐÊ¢Òæ»ª ׿Խ¹ÜÀíÕß±ØÐë¾ß±¸µÄÎåÏîÄÜÁ¦
ijÐÅÏ¢¼¼Êõ¹«Ë¾ PythonÅàѵ
ij²©²ÊITϵͳ³§ÉÌ Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À
ÖйúÓÊ´¢ÒøÐÐ ²âÊÔ³ÉÊì¶ÈÄ£Ðͼ¯³É(TMMI)
ÖÐÎïÔº ²úÆ·¾­ÀíÓë²úÆ·¹ÜÀí